Python 3.x 使用复选按钮修改tkinter for python 3x中的函数
我想构建一个简单的掷骰子应用程序(个人项目,让python变得更好),用户可以使用tkinter选择掷6面还是20面骰子 基本上,应该有4个小部件: 标签(用于打印结果) 按钮(用于运行掷骰子功能) 和2个复选框(选择要掷的骰子) 所以我试过的代码是这样的Python 3.x 使用复选按钮修改tkinter for python 3x中的函数,python-3.x,function,tkinter,checkbox,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("
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:当我点击任何一个复选按钮时,两个按钮上都会出现一个勾号,这意味着两个按钮都被激活了(这可能是我可以通过tkinter变得更好来解决的问题,但是如果你发现了问题,我将感谢你的建议
2:当我点击按钮时,我得到一个错误“RecursionError:比较中超过了最大递归深度”
我想问题是我不能用tkinter来用这种方式调用函数。我实际上是在用这个练习来构建一个更复杂的RPG应用程序,与一些朋友一起使用,你可以选择属性加成来添加到D20掷骰中,但我想尝试一些更简单的方法,不使用t中的其他应用程序他需要密码
到目前为止,python社区是我寻求帮助的所有编码小组中最有帮助、最不轻视的一个,所以提前感谢他们的帮助
Kev.您的代码有很多问题,但让我们只关注您提出的问题。第一个问题来自您对
IntVar
的错误使用:您创建了两个IntVar
,但您将复选按钮的变量设置为var1.get()
get
只是一种将设置的值返回到IntVar的方法。要正确关联变量,请执行以下操作:
C1 = Checkbutton(canvas, text = "6", variable = var1,
onvalue = 1, offvalue = 0, height=1,
width = 10)
另一个复选按钮也是如此
接下来,错误来自函数roll
。您使用text=roll()
创建了一个标签,该标签再次执行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
…但我会让您自己解决这些问题。我还承诺,我已经尝试了多个tkinter教程并阅读了文档,但我就是拿不到答案我只想说一百万谢谢你花时间写这个答案。我知道我的代码太粗鄙了,因为我没有编码经验,只是想通过我的方法,通过犯错学习,然后在你得到我的时候请求帮助。谢谢一百万亨利。没问题。如果有帮助的话,考虑接受。如果你进入“问题”下的“频繁”选项卡,你会看到一些新学员必然会遇到的问题(例如,图像不显示,命令不执行…),在学习过程中阅读这些问题将是一大优势。