【问题标题】:Tkinter displays labels incorrectlyTkinter 显示标签不正确
【发布时间】:2019-09-18 05:37:03
【问题描述】:

我的任务是创建一个程序,您可以在其中运行自己的贩毒集团(非常 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() 的代码,其参数是从非常简单的 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

非常感谢大家的宝贵时间,非常感谢任何帮助。

【问题讨论】:

  • 一开始你可以使用print() 来查看变量中的值——也许它们有错误的值。也许你有空字符串,所以它放了空的地方。
  • 顺便说一句:你可以使用self.origin = radom.choice(('Brighton', 'London', 'Netherlands', 'China', 'USA', 'Mexico'))

标签: python tkinter label


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多