python - 提升包含小部件的 TK 框架
问题描述
我正在尝试重现经典的“帧间切换”示例。我正在尝试包含几个 tkk 小部件并使用.grid()
而不是.pack()
. 切换框架效果很好,但是,我遇到了麻烦“ raising
” tkk 小部件。
import Tkinter as tk
import ttk
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2TkAgg)
import matplotlib.pyplot as plt
import numpy as np
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.grid()
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame("StartPage")
def show_frame(self, page_name):
'''Show a frame for the given page name'''
frame = self.frames[page_name]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.window = parent
label = tk.Label(self, text="This is the start page")
label.grid(pady=10)
button1 = tk.Button(self, text="Go to Page One",
command=lambda: controller.show_frame("PageOne"))
button1.grid()
self.create_widgets()
def create_widgets(self):
# Create some room around all the internal frames
self.window['padx'] = 0
self.window['pady'] = 0
frame1 = ttk.Frame(self.window, relief=tk.RIDGE)
frame1.grid(row=0, column=1, sticky=tk.E + tk.W + tk.N + tk.S, padx=0, pady=0)
frame2 = ttk.Frame(self.window, relief=tk.RIDGE)
frame2.grid(row=1, column=1, sticky=tk.E + tk.W + tk.N + tk.S, padx=0, pady=0)
p = self.Plot(frame1, frame2)
class Plot():
def __init__(self, parent1, parent2):
self.parent1 = parent1
self.parent2 = parent2
canvas = self.plot()
self.plot_toolbar(canvas)
def plot(self):
fig, ax = plt.subplots()
fig.tight_layout()
## plot of sin displayed on page one
p = plt.plot(np.sin(np.arange(10)))
canvas = FigureCanvasTkAgg(fig, self.parent1)
canvas.draw()
return(canvas)
def plot_toolbar(self, canvas):
toolbar = NavigationToolbar2TkAgg(canvas, self.parent2)
toolbar.update()
canvas.get_tk_widget().grid(row=1, column=1)
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.window = parent
label = tk.Label(self, text="This is page 1")
label.grid(pady=10)
button = tk.Button(self, text="Go to the start page",
command=lambda: controller.show_frame("StartPage"))
button.grid()
self.create_widgets()
def create_widgets(self):
# Create some room around all the internal frames
self.window['padx'] = 0
self.window['pady'] = 0
frame1 = ttk.Frame(self.window, relief=tk.RIDGE)
frame1.grid(row=0, column=1, sticky=tk.E + tk.W + tk.N + tk.S, padx=0, pady=0)
frame2 = ttk.Frame(self.window, relief=tk.RIDGE)
frame2.grid(row=1, column=1, sticky=tk.E + tk.W + tk.N + tk.S, padx=0, pady=0)
p = self.Plot(frame1, frame2)
class Plot():
def __init__(self, parent1, parent2):
self.parent1 = parent1
self.parent2 = parent2
canvas = self.plot()
self.plot_toolbar(canvas)
def plot(self):
fig, ax = plt.subplots()
fig.tight_layout()
## plot of a cosin displayed on PageOne
p = plt.plot(np.cos(np.arange(10)))
canvas = FigureCanvasTkAgg(fig, self.parent1)
canvas.draw()
return(canvas)
def plot_toolbar(self, canvas):
toolbar = NavigationToolbar2TkAgg(canvas, self.parent2)
toolbar.update()
canvas.get_tk_widget().grid(row=1, column=1)
if __name__ == "__main__":
app = SampleApp()
app.mainloop()
如果你运行这个,你会发现我可以完美地从 StartPage 和 PageOne 更新 Pages,但是情节并没有从 Sin 变为 Cosin!为什么?
解决方案
解决了:
tkk.Frames
我不需要将SampleApp 容器传递给,而是将传递StartPage.self
或PageOne.self
作为!parent
tkk.Frames
下面按我的意愿工作:
import Tkinter as tk
import ttk
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2TkAgg)
import matplotlib.pyplot as plt
import numpy as np
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.grid()
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame("StartPage")
def show_frame(self, page_name):
'''Show a frame for the given page name'''
frame = self.frames[page_name]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.window = parent
label = tk.Label(self, text="This is the start page")
label.grid(pady=10)
button1 = tk.Button(self, text="Go to Page One",
command=lambda: controller.show_frame("PageOne"))
button1.grid()
self.create_widgets()
def create_widgets(self):
# Create some room around all the internal frame
frame1 = ttk.Frame(self, relief=tk.RIDGE)
frame1.grid(row=0, column=1, sticky=tk.E + tk.W + tk.N + tk.S, padx=0, pady=0)
frame2 = ttk.Frame(self, relief=tk.RIDGE)
frame2.grid(row=1, column=1, sticky=tk.E + tk.W + tk.N + tk.S, padx=0, pady=0)
p = self.Plot(frame1, frame2)
class Plot():
def __init__(self, parent1, parent2):
self.parent1 = parent1
self.parent2 = parent2
canvas = self.plot()
self.plot_toolbar(canvas)
def plot(self):
fig, ax = plt.subplots()
fig.tight_layout()
p = plt.plot(np.exp(np.linspace(0,10,100)))
canvas = FigureCanvasTkAgg(fig, self.parent1)
canvas.draw()
return(canvas)
def plot_toolbar(self, canvas):
toolbar = NavigationToolbar2TkAgg(canvas, self.parent2)
toolbar.update()
canvas.get_tk_widget().grid(row=0, column=0)
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.window = parent
label = tk.Label(self, text="This is page 1")
label.grid(pady=10)
button = tk.Button(self, text="Go to the start page",
command=lambda: controller.show_frame("StartPage"))
button.grid()
self.create_widgets()
def create_widgets(self):
# Create some room around all the internal frames
frame1 = ttk.Frame(self, relief=tk.RIDGE)
frame1.grid(row=0, column=1, sticky=tk.E + tk.W + tk.N + tk.S, padx=0, pady=0)
frame2 = ttk.Frame(self, relief=tk.RIDGE)
frame2.grid(row=1, column=1, sticky=tk.E + tk.W + tk.N + tk.S, padx=0, pady=0)
p = self.Plot(frame1, frame2)
class Plot():
def __init__(self, parent1, parent2):
self.parent1 = parent1
self.parent2 = parent2
canvas = self.plot()
self.plot_toolbar(canvas)
def plot(self):
fig, ax = plt.subplots()
fig.tight_layout()
p = plt.plot(np.sin(np.linspace(0,10,100)))
canvas = FigureCanvasTkAgg(fig, self.parent1)
canvas.draw()
return(canvas)
def plot_toolbar(self, canvas):
toolbar = NavigationToolbar2TkAgg(canvas, self.parent2)
toolbar.update()
canvas.get_tk_widget().grid(row=0, column=0)
if __name__ == "__main__":
app = SampleApp()
app.mainloop()
推荐阅读
- postgresql - 如何在 PostgreSql 函数的返回表中设置标识列?
- ruby-on-rails - Ruby lib console.so 加载错误和未定义符号
- python - 在函数中使用遗传算法(局部) - 最小化函数
- objective-c - 在Objective-C中使用精确的int字典值过滤字典的NSMutableArray
- c# - 如何在代码中设置 xaml DesignInstance 属性
- wordpress - 注意:未定义的属性:stdClass::$file_id Woocommerce
- api - 使用 Symfony 在 API 功能测试中创建模拟
- jquery - CytoscapeJS 背景颜色灰色
- python - 请求 - 无法在 JSON 正文中以 ISO 8601 格式发布日期
- java - 为什么@Sql 在 Spring 测试中不起作用?