使用CheckButtons修改python 3x在tkinter中的功能

时间:2019-07-05 19:13:47

标签: python-3.x function tkinter checkbox

我想构建一个简单的骰子掷骰应用程序(个人项目,以便使用python变得更好),用户可以选择使用tkinter掷6或20面骰子。

基本上,应该有4个小部件: 标签(打印结果) 一个按钮(运行骰子滚动功能) 和2个复选框(以选择要掷出的骰子)

所以我尝试的代码如下所示。

from tkinter import *
import tkinter as tk
import random

window = tk.Tk()

def roll():
    if var1 == 1:
        print("your result is " + str(random.randint(1,6)))
    elif var2 == 1:
        print("your result is " +  str(random.randint(1,20)))
    label = tk.Label(canvas, text = roll(), width = 20, font = 40,
                 height = 1)
    label.place(relx=.5, rely = .2,  anchor='n')

var1 = IntVar()
var2 = IntVar()

canvas = tk.Canvas(window, height = 600, width = 300, bg = 'blue').pack()

C1 = Checkbutton(canvas, text = "6", variable = var1.get(),
                 onvalue = 1, offvalue = 0, height=1,
                 width = 10)
C1.place(relx = .01, rely = .7)

C2 = Checkbutton(canvas, text = "20", variable = var2.get(),
                 onvalue = 1, offvalue = 0, height=1,
                 width = 10)
C2.place(relx = .5, rely = .7)

btn = tk.Button(canvas, text = 'roll dem bones!', command = lambda: 
                roll())
btn.place(relx = .5, rely = .9)

window.mainloop()

到目前为止,我有两个问题。

1:当我单击任一CheckButtons时,两个复选框都出现一个勾号,这意味着它们都已被激活(这可能是我可以通过使用tkinter变得更好而解决的,但是如果您发现问题,我将不胜感激。) / p>

2:当我单击按钮时,出现错误“ RecursionError:在比较中超过了最大递归深度”。

我认为问题是我无法用tkinter以这种方式来调用函数。我实际上是在使用此练习来构建更复杂的RPG应用程序,以与某些朋友一起使用,您可以在其中选择属性奖励以添加到D20角色中,但是我想尝试一些更简单的方法,而不需要其余的代码中的应用。

到目前为止,python社区一直是我寻求帮助的所有编码组中最有用,最不屑一顾的地方,因此在此先感谢您的帮助。

Kev。

1 个答案:

答案 0 :(得分:1)

您的代码有很多问题,但让我们仅关注您所提出的问题。第一个问题来自滥用IntVar:您创建了两个IntVar,但是您将Checkbuttons的variable设置为var1.get()get仅是将设置的值返回给IntVar的方法。正确关联变量:

C1 = Checkbutton(canvas, text = "6", variable = var1,
                 onvalue = 1, offvalue = 0, height=1,
                 width = 10)

与另一个Checkbutton相同。

接下来,该错误来自您的函数roll。您使用text=roll()创建了一个标签,该标签再次执行roll函数,然后又再次执行自身...这会导致您的maximum recursion错误。

要正确地仅修复滚动部分,可以定义另一个函数,该函数将在roll内返回结果:

def roll():
    def get_result():
        if var1.get() == 1:
            return "your result is " + str(random.randint(1,6))
        elif var2.get() == 1:
            return "your result is " +  str(random.randint(1,20))
    label = tk.Label(canvas, text = get_result(), width = 20, font = 40,
                 height = 1)
    label.place(relx=.5, rely = .2,  anchor='n')

请注意,如前所述,我已将if var1 == 1:更改为if var1.get() ==1:

您还有其他问题,例如每次单击都会堆叠新标签,重复使用lambda函数,将变量canvas设置为None ...但是我将保留这些问题供您自己修复。