Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用复选按钮修改tkinter for python 3x中的函数_Python 3.x_Function_Tkinter_Checkbox - Fatal编程技术网

Python 3.x 使用复选按钮修改tkinter for python 3x中的函数

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("

我想构建一个简单的掷骰子应用程序(个人项目,让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:当我点击任何一个复选按钮时,两个按钮上都会出现一个勾号,这意味着两个按钮都被激活了(这可能是我可以通过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教程并阅读了文档,但我就是拿不到答案我只想说一百万谢谢你花时间写这个答案。我知道我的代码太粗鄙了,因为我没有编码经验,只是想通过我的方法,通过犯错学习,然后在你得到我的时候请求帮助。谢谢一百万亨利。没问题。如果有帮助的话,考虑接受。如果你进入“问题”下的“频繁”选项卡,你会看到一些新学员必然会遇到的问题(例如,图像不显示,命令不执行…),在学习过程中阅读这些问题将是一大优势。