我想构建一个简单的骰子掷骰应用程序(个人项目,以便使用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。
答案 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
...但是我将保留这些问题供您自己修复。