Tkinter:使用另一个Radiobutton更改Radiobutton的图像仅在第一次起作用

2024-04-29 12:49:28 发布

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

我正在尝试创建一个游戏级编辑器。该程序读取一个二进制文件,将字节与一个图像关联,然后通过循环显示画布(画布B)中的所有图像。这些图像是按单选按钮显示的。这部分工作正常

下面(画布A)我有一组图像,也是单选按钮。在这里,我通过单击选择要使用的图像。该图像将用于重新设计画布B,然后我转到画布B,决定要更改哪个磁贴并单击它。它工作了:单选按钮现在有了选定的图像。 事实上,它每次都有效,但只有第一次有效。如果我改变主意,想改变一个已经改变的单选按钮,什么都不会发生

我试图通过打印带有.get()的radiobutton变量来理解问题所在,我发现它存储了上次单击的rabiobutton的值。即使使用del我也试图重置此值,但它不起作用

下面是代码(画布B)

img_list=[]
n_row = 0
n_col = 0
index = 0
x = IntVar()
for f in os.listdir(path):
    img_list.append(ImageTk.PhotoImage(Image.open(os.path.join(path,f))))
    n_col +=1
    index +=1
    if n_col > 21:
        n_row +=1
        n_col = 1
    tile = Radiobutton(A, image=img_list[index-1], indicatoron=0, bd=2, variable = x, value = index, selectcolor="red", command=several)
    tile.grid(row=n_row, column = n_col) 

这是画布

    def erase():
        global val_t_e_x
        del val_t_e_x
        
        val_t_e_x=t_e_x.get()
        print(val_t_e_x)
        
        
    img_qui=[]
    for f in os.listdir(path):
        img_qui.append(ImageTk.PhotoImage(Image.open(os.path.join(path,f))))
    def several_editor():    
        global codice_bb
        global val_x
        global val_t_e_x
        val_t_e_x=t_e_x.get()    
        print(val_t_e_x)    
        row_qui=row_list[val_t_e_x-1]
        col_qui=col_list[val_t_e_x-1]   
        tile_editor=Radiobutton(B, image=img_qui[val_x-1], variable = val_t_e_x, value = rev, indicatoron=0, bd=0, selectcolor="blue",
                                  highlightbackground="black", highlightcolor="black", command=erase)
        tile_editor.grid(row=row_qui, column=col_qui)
   
    col_b=0
    row_b=9
    l_editor=[]
    row_list=[]
    col_list=[]
    rev=0
    t_e_x = IntVar()
    
    for x, y in zip(line[::2], line[1::2]):
    
        a= ("./gfx/"+(x+y)+".png")
        row_b-=1
        rev+=1
        if row_b<1:
            col_b+=1
            row_b=8
        im = Image.open(a)
        ph = ImageTk.PhotoImage(im)
        l_editor.append(ph)
        tile_editor = Radiobutton(B, image=l_editor[rev-1], variable = t_e_x, value = rev, indicatoron=0, bd=0, selectcolor="blue",
                                  highlightbackground="black", highlightcolor="black", command=several_editor)
        tile_editor.grid(row=row_b, column=col_b)
        row_list.append(row_b)
        col_list.append(col_b)

我想问题出在函数def_editor()中

tile_editor=Radiobutton(B, image=img_qui[val_x-1], variable = val_t_e_x, value = rev, 
indicatoron=0, bd=0, selectcolor="blue", highlightbackground="black", 
highlightcolor="black", command=erase)

我没有正确地处理val_t_e_x变量

希望你能帮助我


Tags: path图像img画布revcolval按钮
1条回答
网友
1楼 · 发布于 2024-04-29 12:49:28

函数不返回的原因是您不知道几个_editor()的输入是什么。您需要使用lambda将其匿名化。 我将提供一个简单的例子来说明为什么这是必要的:

import tkinter, os, sys
import tkinter.ttk as ttk

class T():
    def __init__(self):
        labelstr=["ascii"]
        top = tkinter.Tk()
        top.geometry('200x50')
        top.title('lambda')
        for label in labelstr:
            self.lab = tkinter.Label(top, text=label, width=len(label)).grid(row=labelstr.index(label)+1, column=0)
            self.ent = tkinter.Entry(top, width=10).grid(row=labelstr.index(label)+1, column=1)
        but = tkinter.Button(top, text="submit", command=lambda: self.submit(top))
        but.grid(row=labelstr.index(label)+1, column=3)
        top.mainloop()

    def submit(self, frame):
        for i in frame.winfo_children():
            if i.winfo_class() == "Entry":
                i.delete(0, tkinter.END)
                i.insert(0, "HelloWorld!")
        

我目前无法真正测试代码,但这应该可以工作

上面提供了一个在代码中正确使用lambda函数的函数示例,并演示了为什么需要它。尝试删除lambda,并确保函数只运行一次,不再正常运行。这种症状对你来说应该很熟悉,因为它和你描述的完全一样。将lambda添加回来,每次按下按钮时,函数都会再次运行

相关问题 更多 >