我的任务是创建一个程序,在该程序中您可以运行自己的毒品卡特尔(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
非常感谢您的宝贵时间,我们将为您提供任何帮助。
答案 0 :(得分:2)
通常最好避免过度使用place
,因为它需要进行大量计算才能使小部件精确地出现在您希望的位置。首选使用pack
或grid
,因为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()