有没有一种方法可以使OptionMenu()在Entry()中没有int之前不可用?

时间:2019-01-25 18:49:05

标签: python python-3.x tkinter tkinter-entry optionmenu

我正在为我的代码制作一个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吗?

感谢您的帮助!

1 个答案:

答案 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 方法标准,它还解决了需要初始化的问题。希望我的评论足以解释这一点,但是如果需要澄清,我会对其进行编辑