首页 > 解决方案 > 在 Python 中使用 GUI 解决从插入值生成自定义数字的问题

问题描述

你好我有python学习项目。我想在 GUI 中插入两个数字,它们定义了程序从中生成随机数的范围。

我真的在按下按钮调用函数时遇到问题。并且不断收到错误 ValueError: invalid literal for int() with base 10: '',当试图将字符串从 GUI 中的条目转换为 int 然后将它们插入 random.randint 时。

谢谢帮助!

from tkinter import *
import random

root = Tk()
root.title("Generator custom random number")

#function that gets number from entry converts string to int and defines target number in stevilo
def function():
    string_answer1 = prvo_stevilo.get()
    int1 = int(string_answer1)
    string_answer2 = drugo_stevilo.get()
    int2 = int(string_answer2)
    stevilo = random.randint(int1, int2)


#Defining GUI
navodilo = Label(root, text="Choose custom lower and upper number to chose random number from", width=60)
navodilo2 = Label(root, text="From", width=20, borderwidth=3)
navodilo3 = Label(root, text="To", width=20, borderwidth=3)
prvo_stevilo = Entry(root, width=20, borderwidth=3)
drugo_stevilo = Entry(root, width=20, borderwidth=3)
gumb = Button(root, text="Generate number", width=17, height=2, command=function)
praznavrstica = Label(root, text="")
izpis = Label(root, text="Random number is: ", width=20)
izpis_stevila = Label(root, text="" + stevilo)

#Showcase of gui
navodilo.grid(row=0, column=0, columnspan=1)
navodilo2.grid(row=1, column=0, columnspan=1)
navodilo3.grid(row=3, column=0, columnspan=1)
prvo_stevilo.grid(row=2, column=0, columnspan=1)
drugo_stevilo.grid(row=4, column=0, columnspan=1)
praznavrstica.grid(row=5, column=0, columnspan=1)
gumb.grid(row=6, column=0, columnspan=1)
praznavrstica.grid(row=7, column=0, columnspan=1)
izpis.grid(row=8, column=0, columnspan=1)
izpis_stevila.grid(row=9, column=0, columnspan=1)


#Loop
root.mainloop()

标签: pythonuser-interfacetkinterrandomgenerate

解决方案


我注意到您的代码存在一些问题。我能够在没有太多更改的情况下使其运行,尽管这可能不是最好的方法。

首先回答您的问题:您收到此错误,因为您正在尝试将 string -> '' 更改为 int。发生这种情况是因为 function() 在您单击按钮之前正在运行。

另一个问题:

izpis_stevila = Label(root, text="" + stevilo)

变量 'stevilo' 在调用 function() 之前根本不存在,所以从这里删除它。

我的改变建议:

1)

gumb = Button(root, text="Generate number", width=17, height=2,command = lambda: function())

如果没有 lambda,无论按钮的状态如何,您的函数都将运行。

2)

first = IntVar(root, value=0)
second = IntVar(root, value=1)
prvo_stevilo = Entry(root, width=20, borderwidth=3, textvariable=first)
drugo_stevilo = Entry(root, width=20, borderwidth=3, textvariable=second)

如果您在条目中没有任何值运行函数,您将收到错误。此更改允许您为条目小部件设置默认值。

3)

def function():
if prvo_stevilo.get() == '' or drugo_stevilo.get() =='':
    return
else:
    string_answer1 = prvo_stevilo.get()
    int1 = int(string_answer1)
    string_answer2 = drugo_stevilo.get()
    int2 = int(string_answer2)
    stevilo = random.randint(int1, int2)
    izpis_stevila = Label(root, text=str(stevilo))
    izpis_stevila.grid(row=9, column=0)

首先检查您的条目是否为空。其次更新标签,还要记住这里将 int 更改为字符串 text=str(stevilo)。


推荐阅读