python - 从笔记本中的其他选项卡访问变量
问题描述
大家好,我在这个小组的最后一个问题没有成功,因为我的代码太长了。我现在已经将我的代码降到最低并添加了一个屏幕截图。我希望这一次一切都清楚而不是混乱。我的问题是:如何检查 Tab1 中的变量“val”是否小于 5。如果不是,Tab1 中的框架和按钮必须为灰色并禁用。按钮不能做任何事情。问题是我已将“val”定义为全局,但它仍然带来“val”未知的错误消息。知道为什么 Tab1 中不知道“val”吗?
# Filename: Tab1.py
from tkinter import *
def gen_t1(frame):
global val
f = LabelFrame(frame, text='f', bg='lightgreen')
f.pack(expand=True, fill='both')
b1 = Button(f, text='B1').pack()
## if val < 5:
## f_enabled = 'disabled'
## f['bg'] = 'lightgray'
## else:
## f_enabled = 'normal'
## f['bg'] = 'lightgreen'
# Filename: Tab2.py
from tkinter import *
def gen_t2(frame):
def getValue(event):
global val
val = ent.get()
print(val)
lbl = Label(frame, text='Val').pack()
ent = Entry(frame)
ent.pack()
ent.insert(0, '2')
ent.bind('<Return>', getValue)
# Filename: TabTop
from tkinter import *
from tkinter import ttk
from Tab1 import gen_t1
from Tab2 import gen_t2
firstTime1 = 1
firstTime2 = 1
root = Tk()
root.title('Tab-Tester')
root.geometry('300x200')
nb = ttk.Notebook(root)
tab1 = Frame(nb)
tab2 = Frame(nb)
nb.add(tab1, text ='Tab 1')
nb.add(tab2, text ='Tab 2')
nb.pack(expand = 1, fill ="both")
def on_tab_change(event):
global firstTime1, firstTime2
tab = event.widget.tab('current','text')
if tab == 'Tab 1':
print('Tab 1')
if firstTime1 == 1:
gen_t1(tab1)
firstTime1 = 0
elif tab == 'Tab 2':
print('Tab 2')
if firstTime2 == 1:
gen_t2(tab2)
firstTime2 = 0
nb.bind('<<NotebookTabChanged>>', on_tab_change)
root.mainloop()
解决方案
我认为您应该使用面向对象的方式来构建您的 GUI。根据我对您的情况的了解,这是我建议的解决方案:
Tab1.py
import tkinter as tk
from tkinter import ttk
class Button_page(ttk.Frame):
"""This will contain what is going to be shown on the first tab."""
def __init__(self, variable_to_check, *args, **kwargs):
super().__init__(*args, **kwargs)
self.variable_to_check = variable_to_check
self.variable_to_check.trace('w', lambda *args: self.update_background())
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
self.internal_style = ttk.Style()
self.internal_style.configure('Tab1.TLabelframe', background='lightgreen')
self.internal_style.configure('Tab1.TLabelframe.Label', background='lightgreen')
self.f = ttk.LabelFrame(self, text='f', style='Tab1.TLabelframe')
self.f.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
self.f.columnconfigure(0, weight=1)
self.f.rowconfigure(0, weight=0)
self.b1 = ttk.Button(self.f, text='B1')
self.b1.grid(column=0, row=0, sticky=(tk.N,))
def update_background(self):
new_value_string = self.variable_to_check.get()
try:
new_value = int(new_value_string)
except (ValueError):
new_value = 0
if new_value < 5:
self.internal_style.configure('Tab1.TLabelframe', background='lightgray')
self.internal_style.configure('Tab1.TLabelframe.Label', background='lightgray')
self.b1.config(state=tk.DISABLED)
else:
self.internal_style.configure('Tab1.TLabelframe', background='lightgreen')
self.internal_style.configure('Tab1.TLabelframe.Label', background='lightgreen')
self.b1.config(state=tk.NORMAL)
选项卡2.py
import tkinter as tk
from tkinter import ttk
class Entry_page(ttk.Frame):
"""This will contain what is going to be shown on the second tab."""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.entry_value = tk.StringVar()
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=0)
self.rowconfigure(1, weight=0)
value_label = ttk.Label(self, text='Val')
value_label.grid(column=0, row=0)
value_entry = ttk.Entry(self, textvariable=self.entry_value)
value_entry.grid(column=0, row=1)
TabTop.py
import tkinter as tk
from tkinter import ttk
import Tab1
import Tab2
root = tk.Tk()
root.title('Tab-Tester')
root.geometry('300x200')
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
nb = ttk.Notebook(root)
t2 = Tab2.Entry_page(nb)
t1 = Tab1.Button_page(variable_to_check=t2.entry_value, master=nb)
t2.entry_value.set(2)
nb.add(t1, text='Tab 1')
nb.add(t2, text='Tab 2')
nb.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
nb.columnconfigure(0, weight=1)
nb.rowconfigure(0, weight=1)
root.mainloop()
要在两个选项卡之间同步信息,您需要一个在 之间连接的tkinter 变量实例和一个在' 的内容更改ttk.Entry
时将触发的回调函数。ttk.Entry
我知道没有很多关于tkinter
. 我会推荐:
- https://tkdocs.com/index.html
- 另一个曾经有更多信息但目前无法访问的站点 ( https://effbot.org/tkinterbook/ ),因此您必须从 2020 年 11 月开始访问 Internet Archive Wayback Machine 副本,以便查看其信息。
我们可以更加面向对象:
TabTop2.py
import tkinter as tk
from tkinter import ttk
import Tab1
import Tab2
class Tab_pages_application(tk.Tk):
def __init__(self, title, size, value_page, action_page, *args, **kwargs):
super().__init__(*args, **kwargs)
self.title(title)
self.geometry(size)
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
nb = ttk.Notebook(self)
t2 = value_page(nb)
t1 = action_page(variable_to_check=t2.entry_value, master=nb)
t2.entry_value.set(2)
nb.add(t1, text='Tab 1')
nb.add(t2, text='Tab 2')
nb.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
nb.columnconfigure(0, weight=1)
nb.rowconfigure(0, weight=1)
if __name__ == '__main__':
root = Tab_pages_application('Tab-Tester', '300x200', Tab2.Entry_page, Tab1.Button_page)
root.mainloop()
那是你试图做的吗?
推荐阅读
- android - 在 MaterialTimePicker 中修改标题文本大小
- node.js - 我的 api 需要时间来处理请求,如何使用 React + SWR 继续检查状态?
- c++ - 尝试计算列表中重复项的数量:C++
- java - 如何在休眠中使用复合键?
- qt - 在 QML 中未触发移位的 ViewTransition
- npm - 设置 npm cafile 会导致 ENOTDIR 错误
- html - 如何在 Rmarkdown 中排列超链接图像?
- r - 有没有办法延迟 R 中函数参数的执行
- python - 从 linux 中的任何位置从 know 文件夹运行 Python 脚本
- node.js - 如何使用 Powershell / Node.js 从回收站恢复特定或上次删除的文件?