0

在 PyCharm 中运行 python 3.8

我正在尝试创建一个类以允许创建一个 tkinter 检查按钮(以及最终的其他小部件),它将保存小部件的所有格式和定义。我希望能够测试检查按钮的状态并在回调中对其进行操作。但像许多其他人一样,我的 checkbutton 变量似乎总是为 0。我很确定这是一个垃圾收集问题,但我想不出办法解决它。注意类定义中的第二组参数指定标签的位置以显示检查按钮变量状态。目前,回调只是在标签中显示变量状态。

致谢:我为此修改了 Burhard Meier 的“Python GUI Programming Cookbook”一书中的代码。与课程相关的代码是我的,其余的来自 Burkhard Meier。

'''
This is a modification of code by Burhard A. Meier
in "Python GUI Programming Cookbook"

Created on Apr 30, 2019
@author: Burkhard A. Meier
'''
#======================
# imports
#======================
import tkinter as tk
from tkinter import ttk

# Create instance
win = tk.Tk()

# Add a title
win.title("GUI Test Box")

# Modify adding a Label
a_label = ttk.Label(win, text="Testing TK Widgets")
a_label.grid(column=0, row=0)

# Modified Button Click Function
def click_me():
    action.configure(text='Hello ' + name.get() + ' ' +
                     number_chosen.get())

#Define the Checkbutton Class
class ChkBut(): #lable, xloc, yloc, xlab, ylab
    def __init__(self, lable, xloc, yloc, xlab, ylab):  # , xloc, yloc, text="default", variable = v, onvalue='Set', offvalue='NotSet'):
        v = tk.IntVar()
        self.v = v
        self.lable = lable
        self.xloc = xloc
        self.yloc = yloc
        self.xlab = xlab
        self.ylab = ylab
        c = tk.Checkbutton(
            win,
            text= self.lable,
            variable=self.v,
            command=self.cb(self.v, xlab,ylab))
        c.grid(column=xloc, row=yloc, sticky = tk.W)
        c.deselect()

    def cb (self, c, xlab, ylab):
        if c.get()==1:
            c_label = ttk.Label(win, text="Set")
            c_label.grid(column=xlab, row=ylab)
        elif c.get()==0:
            c_label = ttk.Label(win, text="NotSet")
            c_label.grid(column=xlab, row=ylab)
        else:
            c_label = ttk.Label(win, text=c.v.get())
            c_label.grid(column=xlab, row=ylab)

# Changing the Label
ttk.Label(win, text="Enter a name:").grid(column=0, row=0)

# Adding a Textbox Entry widget
name = tk.StringVar()
name_entered = ttk.Entry(win, width=12, textvariable=name)
name_entered.grid(column=0, row=1)

# Adding a Button
action = ttk.Button(win, text="Click Me!", command=click_me)
action.grid(column=2, row=1)

# Creating three checkbuttons
ttk.Label(win, text="Choose a number:").grid(column=1, row=0)
number = tk.StringVar()
number_chosen = ttk.Combobox(win, width=12, textvariable=number, state='readonly')
number_chosen['values'] = (1, 2, 4, 42, 100)
number_chosen.grid(column=1, row=1)
number_chosen.current(0)

check1 = ChkBut("Button 1", 0, 4, 0, 5)

chVarUn = tk.IntVar()
check2 = tk.Checkbutton(win, text="UnChecked", variable=chVarUn)
check2.deselect()
check2.chVarUn = 0
check2.grid(column=1, row=4, sticky=tk.W)

chVarEn = tk.IntVar()
check3 = tk.Checkbutton(win, text="Enabled", variable=chVarEn)
check3.select()
check3.chVarEn = 0
check3.grid(column=2, row=4, sticky=tk.W)

name_entered.focus()      # Place cursor into name Entry

#======================
# Start GUI
#======================
win.mainloop()
4

0 回答 0