Variables 下拉选择的tkinter变量为空

Variables 下拉选择的tkinter变量为空,variables,python-3.x,drop-down-menu,tkinter,ttk,Variables,Python 3.x,Drop Down Menu,Tkinter,Ttk,我试着在tkinter中编写一个应用程序,从你从下拉菜单中选择的文件中加载随机行,并在文本窗口中显示所选行 insert\u text中的变量“var”似乎不返回所选的“option”,而是返回一个“空”字符串,导致以下错误: “找不到文件错误”(FileNotFoundError:[Errno2]没有此类文件或 目录:“”) 请帮忙 #!/usr/bin/env python # Python 3 import tkinter from tkinter import ttk import r

我试着在tkinter中编写一个应用程序,从你从下拉菜单中选择的文件中加载随机行,并在文本窗口中显示所选行

insert\u text
中的变量“var”似乎不返回所选的“option”,而是返回一个“空”字符串,导致以下错误:

“找不到文件错误”(FileNotFoundError:[Errno2]没有此类文件或 目录:“”)

请帮忙

#!/usr/bin/env python
# Python 3

import tkinter
from tkinter import ttk
import random

class Application:

    def __init__(self, root):
        self.root = root
        self.root.title('Random Stuff')
        ttk.Frame(self.root, width=450, height=185).pack()     
        self.init_widgets()
        var = tkinter.StringVar(root)
        script = var.get()
        choices = ['option1', 'option2', 'option3']
        option = tkinter.OptionMenu(root, var, *choices)
        option.pack(side='right', padx=10, pady=10)              

    def init_widgets(self):
        ttk.Button(self.root, command=self.insert_txt, text='Button', width='10').place(x=10, y=10) 
        self.txt = tkinter.Text(self.root, width='45', height='5') 
        self.txt.place(x=10, y=50) 

    def insert_txt(self):
        var = tkinter.StringVar(root)
        name = var.get()
        line = random.choice(open(str(name)).readlines())
        self.txt.insert(tkinter.INSERT, line)

if __name__ == '__main__':
    root = tkinter.Tk()
    Application(root)
    root.mainloop()

这是因为您只是创建了一个空的
StringVar
,以后不会修改它,因此返回一个空字符串

OptionMenu采用
命令
参数,该参数在每次选择另一个选项时调用指定的方法。现在,您可以调用这样的方法,替换您的
insert\u txt

def __init__(self):
    # ...
    self.var = tkinter.StringVar()
    self.options = tkinter.OptionMenu(root, var, *choices, command=self.option_selected)
    # ...    

def option_selected(self, event):
    name = self.var.get()
    # The stuff you already had

此外,您必须清空
文本
小部件,否则前面的文本将保留。我认为
Entry
小部件也更适合这样做。

非常感谢,这真的帮了我很大的忙!!!:)遗憾的是,我还不能投票,因为我似乎缺少代表:-/谢谢你编辑我的问题!:)我看到它看起来很奇怪,但当我试图编辑它时,它就像我第一次输入它一样-/