我正在为我的代码制作一个GUI,我需要获得一些用户输入。我有一个Entry()和一个OptionMenu(),我希望OptionMenu()处于range(1,在Entry()中输入的数字+ 1)。
我创建Entry(),然后设置OptionMenu(),列表的范围是1到输入e1的数字。
该程序不想启动,因为e1是=到'',并且无法输入到范围中。
代码:
from tkinter import *
root = Tk()
e1 = Entry(root)
var = StringVar(root)
var.set(3)
ls = list(range(1, int(e1.get()) + 1))
o1 = OptionMenu(root, var, *ls)
root.mainloop()
该怎么办?有没有一种方法可以使OptionMenu()不可用,直到Entry()中使用if并尝试使用int并尝试:+除外:ValueError吗?
感谢您的帮助!
答案 0 :(得分:0)
您可以尝试创建一个按钮,当用户按下该按钮时,它会更新OptionMenu()
,或者您可能拥有一个在启动时创建的线程,它经常扫描Entry
字段并更新相应的列表框。该线程将具有对用户隐藏的优点,但具有额外的计算工作的缺点。我可能会实现这两个选项之一,但是我敢肯定还有更多的可能性!
每个请求我都会详细说明如何通过上述按钮方法解决此问题
import tkinter as tk
from tkinter import ttk # for the Combobox widget
class OOP:
def __init__(self): # initialize our GUI
self.win = tk.Tk() # initialize main window
self.user_selected_option = tk.StringVar() # make a variable that can .get() what the user selects from the menu
self.user_entry = tk.IntVar()
self.user_entry.set(3) # set the initial number or options to be 1-3
possible_range = [i for i in range(1, self.user_entry.get() + 1)]
tk.Entry(self.win, textvariable=self.user_entry).pack(fill='both')
self.option_menu = ttk.Combobox(self.win, state='readonly', textvariable=self.user_selected_option, values=tuple(possible_range))
self.option_menu.pack(fill='both') # we pack it into the GUI
tk.Button(self.win, text='Update', command=self.update_option_menu).pack(fill='both') # we make a button that updates the options available
def update_option_menu(self): # we make a function to update the buttons that the button command is linked to
possible_range = [i for i in range(1, self.user_entry.get() + 1)] # we create a list of values to display (same code as above)
self.option_menu.configure(values=possible_range) # we update the values in the Combobox via its .configure() method
app = OOP() # with the class now defined we make an instance of it
app.win.mainloop() # And we spin up a GUI for that instance
我之所以使用OOP(面向对象编程),是因为我相信它可以用更少的代码来实现更多目标,并为将来创建更多可重用的代码。通过为所有Python类提供 init 方法标准,它还解决了需要初始化的问题。希望我的评论足以解释这一点,但是如果需要澄清,我会对其进行编辑