python - 如何将笔记本的每个选项卡作为一个单独的实体?
问题描述
我正在尝试在 path_entry 字段中设置值。这是代码:
from tkinter import filedialog, ttk,scrolledtext
import tkinter as tk
class GUI(tk.Tk):
def __init__(self):
super().__init__()
self.title("SC")
self.geometry('375x600')
self.resizable(width=False, height=False)
names = ['Tab 1', 'Tab 2', 'Tab 3', 'Tab 4']
self.nb = self.create_notebook(names)
self.menu = self.create_menus()
self.mainloop()
def create_notebook(self, names):
nb = MyNotebook(self, names)
self.file_path = tk.StringVar()
nb.pack()
def path_label(parent):
label = ttk.Label(parent, text="Person file: ").grid(column=0, row=2, padx=10, pady=10)
return label
def path_entry(parent):
path = ttk.Entry(parent, width=30, textvariable=self.file_path).grid(column=1, row=2)
return path
def browse_button(parent):
browse = ttk.Button(parent, text="Browse", command=read_csv, width=30).grid(column=1, row=3, padx=10,
pady=10)
return browse
def newapp_label(parent):
label = ttk.Label(parent, text="Press to : ").grid(column=0, row=4, padx=10, pady=10)
return label
def newapp_button(parent):
newapp = ttk.Button(parent, text="Run New Application", width=30).grid(column=1, row=4, padx=10, pady=10)
return newapp
def read_csv():
file = filedialog.askopenfilename()
if file != None:
self.file_path.set(file)
# Add some labels to each tab
tabs = [nb.tabs['Tab 1'],nb.tabs['Tab 2'], nb.tabs['Tab 3'], nb.tabs['Tab 4']]
for tab in tabs:
path_label(tab)
path_entry(tab)
browse_button(tab)
newapp_label(tab)
newapp_button(tab)
return nb
def create_menus(self):
menu = tk.Menu(self, tearoff=False)
self.config(menu=menu)
subMenu = tk.Menu(menu, tearoff=False)
menu.add_cascade(label="File", menu=subMenu)
subMenu.add_separator()
subMenu.add_command(label='Exit', command=self.destroy)
return menu
class MyNotebook(ttk.Notebook):
''' A customised Notebook that remembers its tabs in a dictionary '''
def __init__(self, master, names):
super().__init__(master, width=390, height=470)
# Create tabs & save them by name in a dictionary
self.tabs = {}
for name in names:
self.tabs[name] = tab = ttk.Frame(self)
self.add(tab, text=name)
GUI()
因此,当您单击浏览按钮时,它会打开一个窗口以在该选项卡的特定条目中加载文件路径。但是我注意到所有其他选项卡的条目字段中的文件/值相同,而我希望每个选项卡都充当单独的实体。简而言之,我想为每 4 个选项卡加载四个不同文件的文件路径。怎么可能
解决方案
这是因为您StringVar
self.file_path
对所有条目都使用了相同的。StringVar
您应该为每个条目使用单独的:
from tkinter.scrolledtext import ScrolledText
...
def create_notebook(self, names):
nb = MyNotebook(self, names)
#self.file_path = tk.StringVar()
nb.pack()
def path_label(parent):
label = ttk.Label(parent, text="Person file: ")
label.grid(column=0, row=2, padx=10, pady=10)
return label
def path_entry(parent):
path = ttk.Entry(parent, width=30, textvariable=parent.file_path)
path.grid(column=1, row=2)
return path
def browse_button(parent):
browse = ttk.Button(parent, text="Browse", command=lambda:read_csv(parent), width=30)
browse.grid(column=1, row=3, padx=10, pady=10)
return browse
def newapp_label(parent):
label = ttk.Label(parent, text="Press to : ")
label.grid(column=0, row=4, padx=10, pady=10)
return label
def newapp_button(parent):
newapp = ttk.Button(parent, text="Run New Application", width=30)
newapp.grid(column=1, row=4, padx=10, pady=10)
return newapp
def add_scrolledtext(parent):
text = ScrolledText(parent, width=40, height=20)
text.grid(column=0, row=5, columnspan=2, padx=10, pady=10, sticky='nsew')
return text
def read_csv(parent):
file = filedialog.askopenfilename()
if file:
parent.file_path.set(file)
# Add some labels to each tab
for name in names:
tab = nb.tabs[name]
# create a StringVar for this tab
tab.file_path = tk.StringVar()
path_label(tab)
path_entry(tab)
browse_button(tab)
newapp_label(tab)
newapp_button(tab)
add_scrolledtext(tab)
return nb
另外,您不应该写类似的东西,label = ttk.Label(...).grid(...)
因为label
is 的结果grid(...)
是None
. 将这两个函数分成两个语句:
label = ttk.Label(...)
label.grid(...)
更新:ScrolledText
在每个选项卡中添加。
推荐阅读
- python-3.x - 逐行读取文件,但从某个点开始
- python - pyodbc:带有包含日期范围的 WHERE 子句的 ORACLE SQL 语句
- c# - 当输入名称为 file[] 时,绑定到 IFormFile 不起作用。Dropzone + .Net Core Web API
- mysql - 我可以使用 DEFAULT 在 MySQL 的 UPDATE 命令中设置时间戳吗?
- parameters - 如何从数据流中访问管道参数?
- json - 将 time:now() 修改为小于一小时
- typescript - 无法解决@reach/dialog
- ios - 检测应用程序中 Google 的 chromecast 服务的使用情况
- javascript - 在 Java 服务器和 Node.js 客户端之间发送文本
- rest - 根据 REST 标准,这些 URL 中的哪一个是最好的?