IntVar().trace()不工作

2024-09-29 23:29:18 发布

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

我刚刚开始用Python/Tkinter编写一个小Pymol插件。在这里,我试图有一个切换按钮,并报告其状态时,点击。按钮上下浮动,但toggleAVA永远不会被调用。有什么想法为什么?在

from Tkinter import *
import tkMessageBox

class AVAGnome:

    def __init__(self, master):
        # create frames
        self.F1 = Frame(rootGnome, padx=5, pady=5, bg='red')

        # checkbuttons
        self.AVAselected = IntVar()
        self.AVAselected.trace("w", self.toggleAVA)
        self.AVAbutton = Checkbutton(self.F1, text='AVA', indicatoron=0, variable=self.AVAselected)

        # start layout procedure
        self.layout()

    def layout(self):
        self.F1.pack(side=TOP, fill=BOTH, anchor=NW)

        #entry and buttons
        self.AVAbutton.pack(side=LEFT)

    def toggleAVA(self, *args):
        if (self.AVAselected.get()):
          avastatus = "selected"
        else:
          avastatus = "unselected"
        tkMessageBox.showinfo("AVA status", avastatus)

def __init__(self):
    open_GnomeUI()

def open_GnomeUI():
    # initialize window
    global rootGnome
    rootGnome = Tk()
    rootGnome.title('AVAGnome')
    global gnomeUI
    gnomeUI = AVAGnome(rootGnome)

Tags: importselfinittkinterdef按钮f1layout
2条回答

我用Pymol测试了你的代码。在

问题是因为您使用Tk()来创建窗口。您必须使用Toplevel(),然后它将与trace()或{}一起正常工作。在


Pymol是用tkinter创建的,它只能有一个用^{创建的窗口-它是程序中的主窗口。必须使用Toplevel()创建其他窗口。在

我在下面附上了你的代码的工作版本。你可以参考它来了解你哪里做错了。通常,如果使用类,则必须注意如何构造代码格式。这个将帮助您更好地可视化代码和调试。你可以阅读这个discussion来帮助你。在

from Tkinter import *
import tkMessageBox

class AVAGnome(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)

        # create frames
        self.F1 = Frame(self, padx=5, pady=5, bg='red')

        # checkbutton 
        self.AVAselected = IntVar() 
        self.AVAselected.trace("w", self.toggleAVA)
        self.AVAbutton = Checkbutton(
            self.F1, text='AVA', indicatoron=0, width=10,
            variable=self.AVAselected)

        # start layout procedure
        self.F1.pack(side=TOP, fill=BOTH, anchor=NW)
        self.AVAbutton.pack(side=LEFT) #entry and buttons

    def toggleAVA(self, *args):
        if (self.AVAselected.get()):
          avastatus = "selected"
        else:
          avastatus = "unselected"
        tkMessageBox.showinfo("AVA status", avastatus)

if __name__ == '__main__':
    rootGnome = Tk()
    rootGnome.title('AVAGnome')
    gnomeUI = AVAGnome(rootGnome)
    gnomeUI.pack(fill="both", expand=True)
    gnomeUI.mainloop()

更新:以上代码结构适用于独立tkinter程序。我试图转换这个工作代码,以遵循Pymol插件的例子。修订后的代码张贴在下面,可以进一步修订。在

^{pr2}$

相关问题 更多 >

    热门问题