获取 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()