Tkinter显示标签不正确

2024-04-29 01:50:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我的任务是创建一个程序,你运行自己的贩毒集团(非常PC),有一组标签和一个按钮在窗口的一侧,你可以购买物品,每个物品是一个类的一部分,标签和按钮是为类内所说的物品。Tkinter偶尔会将这些标签按正确的顺序放置,但Tkinter不会为某些项目随机放置任何东西

我试着改变标签的放置方式,但我什么也没做。似乎什么都没用

下面是为每个项目生成标签和按钮的类

class drug:

    def __init__(self, name, potency, duration, safety, buy):

        self.name = name
        self.origin = ('Brighton', 'London', 'Netherlands', 'China', 'USA', 'Mexico')[ran.randint(0, 5)]
        self.potency = potency
        self.duration = duration
        self.safety = safety
        self.buy = buy
        self.seller = None
        self.paneltitle = Label(mainFrame, text=self.name, font=('Segoe UI', 20, 'bold'))
        self.panellocation = Label(mainFrame, text=self.origin, font=('Segoe UI', 12, 'bold italic'))
        self.panelprice = Label(mainFrame, text='$' + str(self.buy) + ' (/g)', font=('Segoe UI', 12, 'bold italic'))

        self.buybtn = ttk.Button(mainFrame, text='Purchase')

    def place_gen_panel(self, x, y):

        self.paneltitle.place(x=x, y=y)
        self.panellocation.place(x=x, y=y+30)
        self.panelprice.place(x=x, y=y+60)
        self.buybtn.place(x=x, y=y+90)

下面是运行place\u gen\u panel()的代码,其中的参数是从非常简单的for i in range循环计算出来的

for i in range(0, 3):
    obj = drug()
    master_list.append(obj)
    obj.place_gen_panel(10, i*130)

我没有足够高的声誉发布图片,所以我包括链接,而不是

这是一个程序,当它决定要工作

https://i.ibb.co/gmCw21t/Screenshot-2019-09-18-at-06-29-19.png

大多数时候都是这样,不总是中间的项目,有时只显示一个项目

https://i.ibb.co/HF22DD8/Screenshot-2019-09-18-at-06-29-39.png

非常感谢你们抽出时间,非常感谢你们的帮助


Tags: 项目textnameselfplacebuy标签物品
1条回答
网友
1楼 · 发布于 2024-04-29 01:50:37

通常最好避免过度使用place,因为它需要大量的计算才能使小部件精确地显示在您想要的位置。使用packgrid是首选,因为tkiner将为您管理职位

我建议您更改drug类,使其从tk.Frame继承。一旦你得到了正确的几何图形,你就不必处理重叠的小部件了

import tkinter as tk
from tkinter import ttk
import random as ran

class Drug(tk.Frame):

    def __init__(self, master, *args):
        super().__init__(master)
        name, potency, duration, safety, buy = args
        self.name = name
        self.origin = ('Brighton', 'London', 'Netherlands', 'China', 'USA', 'Mexico')[ran.randint(0, 5)]
        self.potency = potency
        self.duration = duration
        self.safety = safety
        self.buy = buy
        self.seller = None
        self.paneltitle = tk.Label(self, text=self.name, font=('Segoe UI', 20, 'bold'))
        self.panellocation = tk.Label(self, text=self.origin, font=('Segoe UI', 12, 'bold italic'))
        self.panelprice = tk.Label(self, text='$' + str(self.buy) + ' (/g)', font=('Segoe UI', 12, 'bold italic'))
        self.buybtn = ttk.Button(self, text='Purchase')

    def place_gen_panel(self):
        for num, widget in enumerate((self.paneltitle, self.panellocation, self.panelprice, self.buybtn)):
            widget.grid(row=num)

master_list = []

mainFrame = tk.Tk()

for i in range(3):
    obj = Drug(mainFrame, "A","B","C","D","E")
    obj.grid(row=i)
    master_list.append(obj)
    obj.place_gen_panel()

mainFrame.mainloop()

相关问题 更多 >