如果在 Python 中选择了下拉列表中的项目,则提示用户输入



我在python中有一个GUI,除其他外,让用户从下拉菜单中选择项目(我使用了tkinter的组合框功能)。

我希望拥有它,以便在选择"自定义"项时,会出现一个输入框,询问用户他们的自定义编号是多少。我不想使用按钮来显示框,但以某种方式拥有它,以便一旦选择自定义,输入框就会出现。我首先尝试使用 while 循环,但我无法让它工作,与 if 语句相同:s

我也尝试使用我在这里找到的askinteger()方法(http://effbot.org/tkinterbook/tkinter-entry-dialogs.htm),但我想出的组合都没有奏效(我对Python很陌生,仍在学习,所以请原谅我的明显错误)。

这是我的 GUI 代码:

from tkinter import *
from tkinter.ttk import *
from tkinter import filedialog
from tkinter import StringVar
from tkinter import messagebox
from tkinter import simpledialog

class MyGUI:
    def __init__(self, master):
        self.master = master
        master.title("Intent/Interpretation Check")
        self.runlabel = Label(master, text="RunID :")
        self.runlabel.grid(row=0, column=0)
        self.runentry = Entry(master)
        self.runentry.grid(row=1, column=0, padx=25)
        self.checklabel = Label(master, text="Check type :")
        self.checklabel.grid(row=0, column=1)
        self.typeselect = Combobox(master)
        self.typeselect['values']=("Intent Score", "Interpretation Score")      
        self.typeselect.grid(row=1, column=1, padx=25)
        self.limitlabel = Label(master, text="Fails if score is below :")
        self.limitlabel.grid(row=0, column=2, padx=25)
        self.limitselect = Combobox(master)
        self.limitselect['values']=(1000, 5000, "Custom")       
        self.limitselect.grid(row=1, column=2, padx=25)
        if self.limitselect.get() != "Custom":
            self.limit = self.limitselect.get()
            pass
        else:
            self.askinteger("Custom limit", "Please enter a number from 1 to 10000", minvalue=1, maxvalue=10000)
        self.submitbutton = Button(master, text="Submit", command=self.checkstatus)
        self.submitbutton.grid(row=1, column=3, padx=25, pady=5)
root = Tk()
root.geometry("+600+300")
my_gui = MyGUI(root)
root.mainloop()

提前非常感谢!

你需要有一个布尔值来告诉何时显示应该显示新的输入。您还需要不断轮询 ComboBox,以查看其值是否等于"自定义"。这是我在大约 3 分钟内想到的。

我没有试图让GUI看起来很漂亮,只是一个功能示例。

from tkinter import *
from tkinter.ttk import *
class Gui:
    def __init__(self):
        self.root = Tk()
        # Set up the Combobox
        self.selections = Combobox(self.root)
        self.selections['values'] = ['Apples', 'Oranges', 'Blueberries', 'Bananas', 'Custom']
        self.selections.pack()
        # The Entry to be shown if "Custom" is selected
        self.custom_field = Entry(self.root)
        self.show_custom_field = False
        # Check the selection in 100 ms
        self.root.after(100, self.check_for_selection)
    def check_for_selection(self):
        '''Checks if the value of the Combobox equals "Custom".'''

        # Get the value of the Combobox
        value = self.selections.get()
        # If the value is equal to "Custom" and show_field is set to False
        if value == 'Custom' and not self.show_custom_field:
            # Set show_field to True and pack() the custom entry field
            self.show_custom_field = True
            self.custom_field.pack()

        # If the value DOESNT equal "Custom"
        elif value != 'Custom':
            # Set show_field to False
            self.show_custom_field = False
            # Destroy the custom input
            self.custom_field.destroy()
            # Set up a new Entry object to pack() if we need it later.
            # Without this line, tkinter was raising an error for me.
            # This fixed it, but I don't promise that this is the
            # most efficient method to do this.
            self.custom_field = Entry(self.root)
        # If the value IS "Custom" and we're showing the custom_feild
        elif value == 'Custom' and self.show_custom_field:
            pass

        # Call this method again to keep checking the selection box
        self.root.after(100, self.check_for_selection)

app = Gui()
app.root.mainloop()

希望这有帮助!

编辑:

要打开一个新窗口,而不是将其打包在与组合框相同的窗口中,请将函数check_for_selection替换为以下内容:

def check_for_selection(self):
    value = self.selections.get()
    # If the value is equal to "Custom" and show_field is set to False
    if value == 'Custom' and not self.show_custom_field:
        # Set show_field to True and pack() the custom entry field
        self.show_custom_field = True
        # Create a new window how we did when we made self.root
        self.new_window = Tk()
        # Create the Entry that will go in the window. The previous Entry widget from line 16, can be removed
        self.custom_field = Entry(self.new_window)
        self.custom_field.pack()
        # Run the new window like we did the original
        self.new_window.mainloop()

    # If the value DOESNT equal "Custom"
    elif value != 'Custom':
        # Destroy the new window that was created if it exists
        if self.show_custom_field:
            self.new_window.destroy()
        # Set show_field to False
        self.show_custom_field = False
    # If the value IS "Custom" and we're showing the custom_feild
    elif value == 'Custom' and self.show_custom_field:
        print('yes')

    # Call this method again to keep checking the selection box
    self.root.after(100, self.check_for_selection)

相关内容

  • 没有找到相关文章

最新更新