当前位置: 首页 > 知识库问答 >
问题:

IntVar()。trace()不工作

左丘昊天
2023-03-14

我刚刚开始用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)

共有2个答案

尹小云
2023-03-14

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

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插件示例。修订后的代码张贴在下面,可能会进一步修订。

# https://pymolwiki.org/index.php/Plugins_Tutorial
# I adapted from the example in the above link and converted my previous code to
# 
from Tkinter import *
import tkMessageBox

def __init__(self): # The example had a self term here.
    self.open_GnomeUI()


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)

# Note, I added a "self" term throughout function. 
# Try w/ & w/o "self" to see which works. 
def open_GnomeUI(self): 
    self.rootGnome = Tk()
    self.rootGnome.title('AVAGnome')
    self.gnomeUI = AVAGnome(self.rootGnome)
    self.gnomeUI.pack(fill="both", expand=True)
    self.gnomeUI.mainloop()
邢财
2023-03-14

我用Pymol测试了你的代码。

问题是因为您使用Tk()来创建窗口。您必须使用Toplevel(),然后它才能与trace()command=一起正常工作。

Pymol是使用tkinter创建的,它只能使用Tk()创建一个窗口-它是程序中的主窗口。每隔一个窗口都必须使用Toplevel()创建。

 类似资料:
  • import "runtime/trace" Go execution tracer. The tracer captures a wide range of execution events like goroutine creation/blocking/unblocking, syscall enter/exit/block, GC-related events, changes of he

  • 问题内容: 我有一个Checkbutton和一个与之关联的对象,但是当我尝试获取的值时,我正在接收。 这是我的代码: 我为什么要得到? 问题答案: 是对对象的引用。您需要调用其方法来访问其表示的值:

  • Xdebug allows you to log all function calls, including parameters and return values to a file in different formats. Those so-called "function traces" can be a help for when you are new to an applicati

  • 此命令用于返回NetRexx使用的当前跟踪设置。 语法 (Syntax) trace 参数 (Parameters) 没有 返回值 (Return Value) NetRexx使用的当前跟踪设置。 例子 (Example) /* Main program */ say trace 当我们运行上述程序时,我们将得到以下结果。 输出 (Output) Off

  • 模块:Trace 目的: 监控程序语句和函数运行情况,并且产生报告信息. python版本:2.3+ trace - 跟踪正在执行的Python语句 trace模块帮助你明白程序的运行过程. 你可以跟踪执行的语句, 产生报表, 也能获取函数间的调用关系. 命令行接口 可以很简单的直接从命令行使用trace. 给定以下的Python脚本: from recurse import recurse d

  • kubectl-trace 是一个 kubectl 插件,它可以使用基于 bpftrace 的编程能力,来分析系统的性能问题。你只需编写好程序文件,就可以通过这个插件将其运行到 K8s 集群中,不需要任何额外工作。 架构

  • Trace Viewer 是 Chrome 和 Android Systrace 的 JavaScript 前端。它提供给各种类型的跟踪文件提供强大的分析和可视化能力,在跟踪 Linux kernel 和 Chrome 的 trace_event format 上尤其有用。Trace Viewer 可作为一个组件嵌入到你的代码中。

  • console-trace 扩展了Node.JS的本地console对象,以CallSite信息给日志功能添加前缀 如何使用: require('console-trace') 你可以添加t或者trace的getter方法来调用以获得stacktrace: console.t.log('a');console.trace.log('aaa');