【问题标题】:Working with checkboxes in tkinter (pygubu)在 tkinter (pygubu) 中使用复选框
【发布时间】:2016-08-18 13:48:24
【问题描述】:

我用 GUI maker pygubu 创建了一个窗口。此窗口包含复选框。但是我的脚本无法识别复选框是否被标记。 我如何检查复选框是否被标记? 我必须使用命令还是变量?什么是正确的语法?

您可以在下面看到我在 pygubu 中所做的事情。如何获取复选框的状态? http://i.stack.imgur.com/W9o5A.jpg

我试过了:

def checker13(self, variable=check13):
    self.variable13 = variable
    print self.variable13

这应该会在每次发生更改时向我打印复选框的状态。但我总是收到一个错误。我能做什么?

【问题讨论】:

  • 不看代码怎么解释代码中的bug?
  • @BryanOakley 我试图更精确。也许你现在可以帮助我?

标签: python tkinter checkbox pygubu


【解决方案1】:

最后我找到了一种不优雅的方法。它不是很“漂亮”,但它有效:

self.xxx1 = 0 
def checker13(self):
    if self.xxx1 == 0:
        self.xxx1 = self.xxx1+1
    else:
        self.xxx1 = 0 

通常不标记复选框,值为0。如果复选框被标记,则有一个事件并且值更改为1。下一个事件将值更改回0。通过这种方法,我可以通过检查xxx1来检查复选框的状态。

我知道还有其他方法(IntVar()),但我专门寻找 pygubu 的解决方案。如果有更流畅的答案,请随时纠正我。

编辑: 从 pygubu 获取变量的值:

variable = self.builder.get_variable('variable')
variable = variable.get()

【讨论】:

    【解决方案2】:

    根据此处的示例http://www.python-course.eu/tkinter_checkboxes.php

    from tkinter import *
    master = Tk()
    var1 = IntVar()
    Checkbutton(master, text="male", variable=var1).grid(row=0, sticky=W)
    var2 = IntVar()
    Checkbutton(master, text="female", variable=var2).grid(row=1, sticky=W)
    mainloop()
    

    您需要设置一个变量来存储复选框的结果,然后引用它(在本例中为 var1 和 var2)。

    编辑:更具体地回答您的问题;您可以检查var1var2 的结果,因为它们将等于0 未检查或1 已检查。希望这会有所帮助。

    【讨论】:

    • 谢谢,但您的回答并没有真正帮助我。我试图更精确。也许你可以查看我编辑的帖子?
    • 您需要从一开始就更加具体。希望有人可以根据这些新信息回答您的问题。
    【解决方案3】:

    感谢您澄清您的问题。现在我知道您正在使用 Pygubu 来构建您的 GUI,我可以进一步研究一下。我发现以下文档页面可以帮助您解决问题: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-Checkbutton.html

    要注意的关键 Checkbutton 选项是 variable 选项。在您提供的图像中,您似乎尝试将variable 选项设置为var。上面的文档说明了variable 选项:

    跟踪检查按钮当前状态的控制变量... 通常你会在这里使用 IntVar,并且 off 和 on 的值为 0 和 1,分别。

    您是否可以选择将variable 选项更改为IntVar,而不是图片中的int?如果没有,那应该还是可以的。

    因此,变量var 将存储 Checkbutton 的状态。在您提供的图片中,您将command 选项设置为checker13。保持这样。现在,由于我从未使用过 Pygubu(甚至 Tkinter),我不能确定这段代码是否有效,但请尝试以下操作:

    def checker13(self):
        print(self.var)
    

    如果这不起作用,试试这个:

    def checker13(self):
        print(self.variable)
    

    如果其中一项有效,请告诉我,以便我可以使用工作代码编辑我的答案。如果您仍然卡住,请告诉我。

    【讨论】:

    • 谢谢,但您的回答并没有真正帮助我。我试图更精确。也许你可以查看我编辑的帖子?
    • 我改变了答案。让我知道这是否适合你!
    • 不,我没有工作。我收到另一个错误AttributeError: Application instance has no attribute 'var'
    • 我找到了另一个解决方案。有兴趣的可以去看看:D
    【解决方案4】:

    我刚遇到这个问题。以下是仅处理复选框的简化解决方案。

    checkbox_example.py 内容:

    import tkinter as tk
    import pygubu
    
    class App:
        def __init__(self, master):
            self.master = master
            self.builder = builder = pygubu.Builder() # Create builder
            builder.add_from_file('checkbox_example.ui') # Load ui file.
    
            # Create widget using master as parent
            self.mainwindow = builder.get_object('mainwindow', master)
    
            builder.connect_callbacks(self) # Connect callbacks
    
            # Create check button object
            self.check_button_object = builder.get_object('cb0', self.mainwindow)
    
        def on_checkbox_clicked(self):
            print("on_checkbox_clicked")
            checked = self.builder.get_variable('checked') # Get variable
            print(checked.get()) # get value of checked and print it
    
    if __name__ == '__main__':
        root = tk,Tk()
        app = App(root)
        root.mainloop()
    

    checkbox_example.ui 的内容是:

    <?xml version='1.0' encoding='utf-8'?>
    <interface>
      <object class="tk.Frame" id="mainwindow">
        <property name="height">200</property>
        <property name="width">200</property>
        <layout>
          <property name="column">0</property>
          <property name="propagate">True</property>
          <property name="row">0</property>
          <property name="sticky">nw</property>
        </layout>
        <child>
          <object class="tk.Checkbutton" id="cb0">
            <property name="command">on_checkbox_clicked</property>
            <property name="cursor">arrow</property>
            <property name="font">TkDefaultFont</property>
            <property name="offvalue">0</property>
            <property name="onvalue">1</property>
            <property name="pady">0</property>
            <property name="text" translatable="yes">checkbox_string</property>
            <property name="underline">0</property>
            <property name="variable">int:checked</property>
            <layout>
              <property name="column">0</property>
              <property name="propagate">True</property>
              <property name="row">1</property>
            </layout>
          </object>
        </child>
      </object>
    </interface>
    

    为了查看它的执行情况,我创建了一个简短的 youtube 剪辑: https://youtu.be/Y6lpi3oihOo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多