使用tkinter中的复选框(pygubu)

时间:2016-08-18 13:48:24

标签: python checkbox tkinter

我用GUI制造商pygubu创建了一个窗口。该窗口包含复选框。但我的脚本无法识别是否标记了复选框。 如何检查复选框是否已标记? 我是否要使用命令或变量?什么是正确的语法?

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

我试过了:

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

这应该在每次更改时打印出复选框的状态。但我总是收到一个错误。我该怎么办?

4 个答案:

答案 0 :(得分:0)

根据此处的示例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进行检查。希望这会有所帮助。

答案 1 :(得分:0)

感谢您澄清您的问题。现在我知道你正在使用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)

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

答案 2 :(得分:0)

最后,我找到了一种不太优雅的方式。它不是很漂亮"但它确实有效:

android:layout_weight

通常情况下,未标记复选框,值为EditText。如果复选框被标记,则会有一个事件,并且值会更改为self.xxx1 = 0 def checker13(self): if self.xxx1 == 0: self.xxx1 = self.xxx1+1 else: self.xxx1 = 0 。下一个事件会将值更改回0。通过这种方法,我可以通过选中1来检查复选框的状态。

我知道还有其他方法(使用0),但我专门用pygubu搜索解决方案。如果答案更顺利,请随时纠正我。

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

xxx1

答案 3 :(得分:0)

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

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