获取 2 个单独的 tkinter windows 而不是浏览 3 个页面
Getting 2 separate tkinter windows instead of navigating through 3 pages
我正在尝试将我的图表从 matplot 合并到 tkinter window 中并能够浏览不同的图表。我现在已经尝试过试验并在上面绘制了一张图表。但是,我从 tkinter 得到 2 windows 而不是 1.
我已经插入了我到目前为止所做的代码:
import tkinter as tk
from tkinter import ttk
import matplotlib
matplotlib.use('TkAgg')
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *
import itertools
import copy
import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,
NavigationToolbar2Tk
from tkinter import *
import tkinter.messagebox as tm
LARGE_FONT=("Verdana", 12) #font type and font size
df1= pd.read_csv(r"U:\GE90\nodes_fixed.csv")
df2 = pd.read_csv(r"U:\GE90\edge_list_3_fixed.csv")
g=nx.Graph()
# Add edges and edge attributes
for i, elrow in df2.iterrows():
# g.add_edge(elrow[0], elrow[1], attr_dict=elrow[2:].to_dict()) #
deprecated after NX 1.11
g.add_edge(elrow[0], elrow[1], **elrow[2:].to_dict())
app=Tk()
class Trial(tk.Tk):
#self -implied but does not need to be passed at all depending on the
structure
#* = args --> arguments, unlimited number of variables --> can pass
through as many variables as you want
#** = kwargs --> keyboard arguments, passing through dictionaries
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.wm_title(self, "Trial Only")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne, PageTwo, plot):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self,parent)
label = tk.Label(self, text="Start Page", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button = ttk.Button(self, text="Visit Page 1",
command=lambda: controller.show_frame(PageOne))
button.pack()
#Adding a page
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page One", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button1 = ttk.Button(self, text="Back to home",
command=lambda:
controller.show_frame(StartPage))
button1.pack()
button2 = ttk.Button(self, text="Visit page two",
command=lambda: controller.show_frame(PageTwo))
button2.pack()
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page Two!!!", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button3 = ttk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
button3.pack()
button4 = ttk.Button(self, text="Page One",
command=lambda: controller.show_frame(PageOne))
button4.pack()
button5 = ttk.Button(self, text="Visit Page 3",
command=lambda: controller.show_frame(PageThree))
button5.pack()
class plot (tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label= tl.Label(self, text= "Figure 1", font = LARGE_FONT)
label.pack(pady=10,padx=10)
# Edge list example
print(elrow[0]) # node1
print(elrow[1]) # node2
print(elrow[2:].to_dict()) # edge attribute dict
# Add node attributes
for i, nlrow in df1.iterrows():
# g.node[nlrow['id']] = nlrow[1:].to_dict() # deprecated after NX 1.11
nx.set_node_attributes(g, {nlrow['ID']: nlrow[1:].to_dict()})
# Node list example
print(nlrow)
# Preview first 5 edges
list(g.edges(data=True))[0:5]
# Preview first 10 nodes
list(g.nodes(data=True))[0:10]
print('# of edges: {}'.format(g.number_of_edges()))
print('# of nodes: {}'.format(g.number_of_nodes()))
# Define node positions data structure (dict) for plotting
for node in g.nodes(data=True):
print(node)
print("")
node_positions = {node[0]: (node[1]['X'], -node[1]['Y']) for node in
g.nodes(data=True)}
# Preview of node_positions
dict(list(node_positions.items())[0:5])
# Define data structure (list) of edge colors for plotting
# edge_colors = [e[2]['color'] for e in g.edges(data=True)]
edge_colors = [e[2]['color'] for e in list(g.edges(data=True))]
# Preview first 10
edge_colors[0:10]
fig = plt.figure(figsize=(8, 6))
nx.draw(g, pos=node_positions, edge_color=edge_colors, node_size=10,
node_color='black')
plt.title('Graph Representation of repair trail', size=15)
canvas = FigureCanvasTkAgg(fig, app)
canvas.get_tk_widget().pack()
canvas.draw()
app = Trial()
app.mainloop()
我想显示一个来自 tkinter 的 window 来显示所有不同的页面,但是,输出给了我 2 个不同的 windows 来自 tkinter
第一个带有所有起始页面和按钮
第二个只是来自 class plot
的图表
您正在明确创建两个 windows。
第一行是:app=Tk()
第二行是 app = Trial()
,因为 Trial
继承自 tk.Tk
。
你得到两个 windows 因为你用 app = Tk()
创建了第一个 window,然后在你初始化 Trial
时创建了第二个 Trial
因为它继承自 Tk
.事实上你不需要 app = Tk()
.
您希望您的绘图位于其中一页中,因此您需要将创建 matplotlib 图的所有代码移动到您的 Page
class 之一中,例如PageTwo
:
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page Two")
label.pack(pady=10, padx=10)
# code for the plot
fig = plt.figure(figsize=(8, 6)) # create matplotlib figure
# add axes and plot (replace this by your matplotlib code)
ax = fig.subplots()
ax.plot(range(10))
ax.set_title('Graph Representation of repair trail', size=15)
# create the tkinter widget to display the figure
canvas = FigureCanvasTkAgg(fig, self) # here self is the widget in which you want to display the figure
canvas.get_tk_widget().pack()
toolbar = NavigationToolbar2Tk(canvas, self) # add toolbar
canvas.draw() # show content
# navigation button
button3 = ttk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
button3.pack()
button4 = ttk.Button(self, text="Page One",
command=lambda: controller.show_frame(PageOne))
button4.pack()
我正在尝试将我的图表从 matplot 合并到 tkinter window 中并能够浏览不同的图表。我现在已经尝试过试验并在上面绘制了一张图表。但是,我从 tkinter 得到 2 windows 而不是 1.
我已经插入了我到目前为止所做的代码:
import tkinter as tk
from tkinter import ttk
import matplotlib
matplotlib.use('TkAgg')
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *
import itertools
import copy
import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,
NavigationToolbar2Tk
from tkinter import *
import tkinter.messagebox as tm
LARGE_FONT=("Verdana", 12) #font type and font size
df1= pd.read_csv(r"U:\GE90\nodes_fixed.csv")
df2 = pd.read_csv(r"U:\GE90\edge_list_3_fixed.csv")
g=nx.Graph()
# Add edges and edge attributes
for i, elrow in df2.iterrows():
# g.add_edge(elrow[0], elrow[1], attr_dict=elrow[2:].to_dict()) #
deprecated after NX 1.11
g.add_edge(elrow[0], elrow[1], **elrow[2:].to_dict())
app=Tk()
class Trial(tk.Tk):
#self -implied but does not need to be passed at all depending on the
structure
#* = args --> arguments, unlimited number of variables --> can pass
through as many variables as you want
#** = kwargs --> keyboard arguments, passing through dictionaries
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.wm_title(self, "Trial Only")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne, PageTwo, plot):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self,parent)
label = tk.Label(self, text="Start Page", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button = ttk.Button(self, text="Visit Page 1",
command=lambda: controller.show_frame(PageOne))
button.pack()
#Adding a page
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page One", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button1 = ttk.Button(self, text="Back to home",
command=lambda:
controller.show_frame(StartPage))
button1.pack()
button2 = ttk.Button(self, text="Visit page two",
command=lambda: controller.show_frame(PageTwo))
button2.pack()
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page Two!!!", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button3 = ttk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
button3.pack()
button4 = ttk.Button(self, text="Page One",
command=lambda: controller.show_frame(PageOne))
button4.pack()
button5 = ttk.Button(self, text="Visit Page 3",
command=lambda: controller.show_frame(PageThree))
button5.pack()
class plot (tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label= tl.Label(self, text= "Figure 1", font = LARGE_FONT)
label.pack(pady=10,padx=10)
# Edge list example
print(elrow[0]) # node1
print(elrow[1]) # node2
print(elrow[2:].to_dict()) # edge attribute dict
# Add node attributes
for i, nlrow in df1.iterrows():
# g.node[nlrow['id']] = nlrow[1:].to_dict() # deprecated after NX 1.11
nx.set_node_attributes(g, {nlrow['ID']: nlrow[1:].to_dict()})
# Node list example
print(nlrow)
# Preview first 5 edges
list(g.edges(data=True))[0:5]
# Preview first 10 nodes
list(g.nodes(data=True))[0:10]
print('# of edges: {}'.format(g.number_of_edges()))
print('# of nodes: {}'.format(g.number_of_nodes()))
# Define node positions data structure (dict) for plotting
for node in g.nodes(data=True):
print(node)
print("")
node_positions = {node[0]: (node[1]['X'], -node[1]['Y']) for node in
g.nodes(data=True)}
# Preview of node_positions
dict(list(node_positions.items())[0:5])
# Define data structure (list) of edge colors for plotting
# edge_colors = [e[2]['color'] for e in g.edges(data=True)]
edge_colors = [e[2]['color'] for e in list(g.edges(data=True))]
# Preview first 10
edge_colors[0:10]
fig = plt.figure(figsize=(8, 6))
nx.draw(g, pos=node_positions, edge_color=edge_colors, node_size=10,
node_color='black')
plt.title('Graph Representation of repair trail', size=15)
canvas = FigureCanvasTkAgg(fig, app)
canvas.get_tk_widget().pack()
canvas.draw()
app = Trial()
app.mainloop()
我想显示一个来自 tkinter 的 window 来显示所有不同的页面,但是,输出给了我 2 个不同的 windows 来自 tkinter 第一个带有所有起始页面和按钮 第二个只是来自 class plot
的图表您正在明确创建两个 windows。
第一行是:app=Tk()
第二行是 app = Trial()
,因为 Trial
继承自 tk.Tk
。
你得到两个 windows 因为你用 app = Tk()
创建了第一个 window,然后在你初始化 Trial
时创建了第二个 Trial
因为它继承自 Tk
.事实上你不需要 app = Tk()
.
您希望您的绘图位于其中一页中,因此您需要将创建 matplotlib 图的所有代码移动到您的 Page
class 之一中,例如PageTwo
:
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page Two")
label.pack(pady=10, padx=10)
# code for the plot
fig = plt.figure(figsize=(8, 6)) # create matplotlib figure
# add axes and plot (replace this by your matplotlib code)
ax = fig.subplots()
ax.plot(range(10))
ax.set_title('Graph Representation of repair trail', size=15)
# create the tkinter widget to display the figure
canvas = FigureCanvasTkAgg(fig, self) # here self is the widget in which you want to display the figure
canvas.get_tk_widget().pack()
toolbar = NavigationToolbar2Tk(canvas, self) # add toolbar
canvas.draw() # show content
# navigation button
button3 = ttk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
button3.pack()
button4 = ttk.Button(self, text="Page One",
command=lambda: controller.show_frame(PageOne))
button4.pack()