Tkinter无法正确显示标签

时间:2019-09-18 05:37:03

标签: python tkinter label

我的任务是创建一个程序,在该程序中您可以运行自己的毒品卡特尔(Very 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_gen_panel()的代码,这些参数是根据范围循环中非常简单的i计算得出的。

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

非常感谢您的宝贵时间,我们将为您提供任何帮助。

1 个答案:

答案 0 :(得分:2)

通常最好避免过度使用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()