我尝试在tkinter中编写一个应用程序,它会从您从下拉菜单中选择的文件中加载随机行,并在文本窗口中显示所选行。
似乎insert_text
中的变量“var”不会返回选定的“选项”,而是返回“空”字符串,从而导致以下错误:
“找不到文件错误”(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()
答案 0 :(得分:2)
那是因为您只是创建了一个之后未修改的空StringVar
,因此会返回一个空字符串。
每次选择另一个选项时,OptionMenu都会使用调用指定方法的command
参数。现在,您可以调用这样的方法,替换为insert_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
此外,您必须清空Text
小部件,否则之前的文本将保留。我认为Entry
窗口小部件也更好。