我正在尝试制作一个自动售货机用户界面,该界面具有使用以下代码动态生成的25个按钮:
def retrieve_tiem(): #SQL query to reteive item into Item_List[]
ROWS = COLS = 5
MAX_ITEMS = ROWS * COLS
frames = []
for i in range(MAX_ITEMS):
frames.append(Frame(store_canvas, width=1520 / COLS, height=1030 / ROWS, bd=2, relief=SOLID))
frames[-1].grid(row=i // COLS, column=i % COLS)
frames[-1].pack_propagate(False)
def update_list():
label_font = ("Arial", 15)
for i,frame in enumerate(frames):
for w in frame.winfo_children():
w.destroy()
if i < len(Item_list):
item = Item_list[i]
Button(frame).pack(fill="both", expand=1)
Label(frame, text=Item_list[i], font=label_font, bg="darkgreen", fg="yellow").pack(fill="x")
我如何获得此代码及其bg的上下文在此处。我希望能够使用该按钮来调用顶级窗口小部件,以显示与该按钮相对应的正确的待售商品。但是,此代码生成的网格将根据用户选择的过滤器选项动态减少或增加。这意味着没有按钮可以保存每次要调用的相同“ ID”。我先在网上看了一下,发现这个问题有点相似。唯一的缺点是该帖子中的按钮是固定的,不会移动。我有办法达到上述效果吗?同样对于类似的链接文章,这可能对我有用,但我只是在逻辑上分析了它错了吗?非常感谢所有答案。
编辑:对于那些希望快速,重现按钮的行为的结果的人,基于过滤器的项目数量增加或减少时,代码如下:
from tkinter import *
import random
root = Tk()
store_canvas = Frame(root)
store_canvas.pack()
# create the 25 frames
ROWS = COLS = 5
MAX_ITEMS = ROWS * COLS
frames = []
for i in range(MAX_ITEMS):
frames.append(Frame(store_canvas, width=1520/COLS, height=1030/ROWS, bd=2, relief=SOLID))
frames[-1].grid(row=i//COLS, column=i%COLS)
frames[-1].pack_propagate(False)
# function to simulate retrieving data from database table
def retrieve_tiem():
return [f"Item #{i+1}" for i in range(random.randint(1,MAX_ITEMS))]
# function to show the retrieved items
def update_list():
Item_list = retrieve_tiem()
label_font = ("Arial", 20)
for i, frame in enumerate(frames):
for w in frame.winfo_children():
w.destroy()
if i < len(Item_list):
item = Item_list[i]
Button(frame).pack(fill="both", expand=1)
Label(frame, text=item, font=label_font, bg="darkgreen", fg="yellow").pack(fill="x")
update_list()
root.bind("<F5>", lambda e: update_list())
root.mainloop()
因此,根据@ acw1668在上面的注释部分中建议的解决方案,我使用将该项目的名称传递给该函数Button(frame, command=lambda name=item: show_item(name))
,然后创建函数,def show_item(name)
并自动对传递的项目名称做任何我想做的事情。示例代码是:
from tkinter import *
import random
root = Tk()
store_canvas = Frame(root)
store_canvas.pack()
# create the 25 frames
ROWS = COLS = 5
MAX_ITEMS = ROWS * COLS
frames = []
for i in range(MAX_ITEMS):
frames.append(Frame(store_canvas, width=1520/COLS, height=1030/ROWS, bd=2, relief=SOLID))
frames[-1].grid(row=i//COLS, column=i%COLS)
frames[-1].pack_propagate(False)
# function to simulate retrieving data from database table
def retrieve_tiem():
return [f"Item #{i+1}" for i in range(random.randint(1,MAX_ITEMS))]
# function to show the retrieved items
def update_list():
Item_list = retrieve_tiem()
label_font = ("Arial", 20)
for i, frame in enumerate(frames):
for w in frame.winfo_children():
w.destroy()
if i < len(Item_list):
item = Item_list[i]
Button(frame, command=lambda name=item: show_item(name)).pack(fill="both", expand=1)
Label(frame, text=item, font=label_font, bg="darkgreen", fg="yellow").pack(fill="x")
def show_item(name):
print(name)
update_list()
root.bind("<F5>", lambda e: update_list())
root.mainloop()
再次感谢您@ acw1668的回答。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句