首页 > 解决方案 > 需要将画布移动到应用的右侧

问题描述

我到了这一点,但我希望它build_report位于应用程序的右侧,紧挨着其他框架,并且能够在窗口大小发生变化时自动调整它的大小。任何人都可以给我一个关于如何实现它的建议吗?

from tkinter import *
import os, subprocess
from tkinter import ttk
import tkinter as tk

class ScrolledFrame(tk.Frame):

    def __init__(self, parent, vertical=True, horizontal=True):
        super().__init__(parent)

        # canvas for inner frame
        self._canvas = tk.Canvas(self)
        self._canvas.grid(row=0, column=0, sticky='news') # changed

        # create right scrollbar and connect to canvas Y
        self._vertical_bar = tk.Scrollbar(self, orient='vertical', command=self._canvas.yview)
        if vertical:
            self._vertical_bar.grid(row=0, column=1, sticky='ns')
        self._canvas.configure(yscrollcommand=self._vertical_bar.set)

        # create bottom scrollbar and connect to canvas X
        self._horizontal_bar = tk.Scrollbar(self, orient='horizontal', command=self._canvas.xview)
        if horizontal:
            self._horizontal_bar.grid(row=1, column=0, sticky='we')
        self._canvas.configure(xscrollcommand=self._horizontal_bar.set)

        # inner frame for widgets
        self.inner = tk.Frame(self._canvas)
        self._window = self._canvas.create_window((0, 0), window=self.inner, anchor='nw')

        # autoresize inner frame
        self.columnconfigure(0, weight=1) # changed
        self.rowconfigure(0, weight=1) # changed

        # resize when configure changed
        self.inner.bind('<Configure>', self.resize)

        # resize inner frame to canvas size
        self.resize_width = False
        self.resize_height = False
        self._canvas.bind('<Configure>', self.inner_resize)

    def resize(self, event=None): 
        self._canvas.configure(scrollregion=self._canvas.bbox('all'))

    def inner_resize(self, event):
        # resize inner frame to canvas size
        if self.resize_width:
            self._canvas.itemconfig(self._window, width=event.width)
        if self.resize_height:
            self._canvas.itemconfig(self._window, height=event.height)

managment = ["main","nav","output","outputspare","gateway","sync1","sync2","storinator"]
thirdrack = ["recon01","recon02","recon03","recon04","recon05","recon06","recon07","recon08","recon09","recon10","recon11","recon12","render01","render02"]
FGCs =["fgc01","fgc02","fgc03","fgc04","fgc05","fgc06","fgc07","fgc08","fgc09","fgc10","fgc11","fgc12","fgc13","fgc14","fgc15","fgc16","fgc17","fgc18","fgc19","fgc20","fgc21","fgc22","fgc23","fgc24","fgc25","fgc26","fgc27","fgc28","fgc29","fgc30","fgc31","fgc32","fgc33","fgc34","fgc35","fgc36","fgc37","fgc38","fgcspare1","fgcspare2","fgcspare3","fgcspare4"]
tests = ["Network", "GPU", "Time", "Gidel", "Snapshot", "Disks"]
testbuttons = []
serverbuttons = []
managebuttons = []
fgcbuttons = []
thirdbuttons = []
f=open(os.devnull, 'w')

class mainwindow(tk.Frame):
    def __init__(self,master, *args, **kwargs):
        self.master = master
        super().__init__(master, *args, **kwargs)
        master.title("System Report Tool")
        master.geometry("1000x700")
        self.reportnotebook = ttk.Notebook(root)
        self.build_tests()
        self.build_manage()
        self.build_fgcs()
        self.build_third()
        self.build_report()

    def build_tests(self):
        self.Tests = ttk.LabelFrame(root, text="  Tests")
        self.Tests.pack(expand="no",anchor=W,pady=10, padx=10)

        for test in tests:
            testcheck = ttk.Checkbutton(self.Tests, text=test)
            testcheck.pack(side=LEFT, anchor="w")
            testbuttons.append(testcheck)

        def select_tests():
            for test in testbuttons:
                test.invoke()

        selecttests = ttk.Checkbutton(root,command=select_tests)
        selecttests.place(x=0,y=7)

        selecttests.invoke()
        selecttests.invoke()

    def build_manage(self):
        self.Managment = ttk.LabelFrame(root, text="  Managment")
        self.Managment.configure(width=10, height=20)
        self.Managment.pack(expand="no",anchor=W, padx=10,pady=10)


        rowno = 0
        columnno = 0
        for manage in managment:
            if columnno >= 6:
                rowno += 1
                columnno = 0
                # pingresponse=subprocess.call(['ping', '-n', '1', '-w', '1', manage],
                #                              stdout=f,
                #                              stderr=subprocess.STDOUT)
                pingresponse = 0
                if pingresponse == 0:
                    managecheck = ttk.Checkbutton(self.Managment, text=manage)
                    managecheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    managebuttons.append(managecheck)
                else:
                    managecheck = ttk.Checkbutton(self.Managment, text=manage)
                    managecheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    managecheck.config(state=DISABLED)
            else:
                pingresponse = 0
                if pingresponse == 0:
                    managecheck = ttk.Checkbutton(self.Managment, text=manage)
                    managecheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    managebuttons.append(managecheck)

                else:
                    managecheck = ttk.Checkbutton(self.Managment, text=manage)
                    managecheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    managecheck.config(state=DISABLED)

        def select_manage():
            for manage in managebuttons:
                manage.invoke()

        selectmanage = ttk.Checkbutton(root,command=select_manage)
        selectmanage.place(x=0,y=68)

        selectmanage.invoke()
        selectmanage.invoke()

    def build_fgcs(self):
        self.FGCs = ttk.LabelFrame(root, text="  FGCs")
        self.FGCs.configure(width=10, height=20)
        self.FGCs.pack(expand="no",anchor=W,padx=10,pady=10)

        rowno = 0
        columnno = 0
        for fgc in FGCs:
            if columnno >= 6:
                rowno += 1
                columnno = 0
                #pingresponse=subprocess.call(['ping', '-n', '1', '-w', '1', fgc],
                #                            stdout=f,
                #                            stderr=subprocess.STDOUT)
                pingresponse = 0
                if pingresponse == 0:
                    fgccheck = ttk.Checkbutton(self.FGCs, text=fgc)
                    fgccheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    fgcbuttons.append(fgccheck)
                else:
                    fgccheck = ttk.Checkbutton(self.FGCs, text=fgc)
                    fgccheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    fgccheck.config(state=DISABLED)
            else:
                #pingresponse=subprocess.call(['ping', '-n', '1', '-w', '1', fgc],
                #                            stdout=f,
                #                            stderr=subprocess.STDOUT)
                pingresponse = 0
                if pingresponse == 0:
                    fgccheck = ttk.Checkbutton(self.FGCs, text=fgc)
                    fgccheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    fgcbuttons.append(fgccheck)
                else:
                    fgccheck = ttk.Checkbutton(self.FGCs, text=fgc)
                    fgccheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    fgccheck.config(state=DISABLED)

        def select_fgc():
            for fgc in fgcbuttons:
                fgc.invoke()

        selectfgc = ttk.Checkbutton(root,command=select_fgc)
        selectfgc.place(x=0,y=148)

        selectfgc.invoke()
        selectfgc.invoke()

    def build_third(self):
        self.thirdrack = ttk.LabelFrame(root, text="  3rd Rack")
        self.thirdrack.configure(width=25, height=20)
        self.thirdrack.pack(expand="no",anchor=W, padx=10, pady=10)


        rowno = 0
        columnno = 0
        for thirdserver in thirdrack:
            if columnno >= 6:
                rowno += 1
                columnno = 0
                # pingresponse=subprocess.call(['ping', '-n', '1', '-w', '1', thirdserver],
                #                              stdout=f,
                #                              stderr=subprocess.STDOUT)
                pingresponse = 0
                if pingresponse == 0:
                    thirdcheck = ttk.Checkbutton(self.thirdrack, text=thirdserver)
                    thirdcheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    thirdbuttons.append(thirdcheck)
                else:
                    thirdcheck = ttk.Checkbutton(self.thirdrack, text=thirdserver)
                    thirdcheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    thirdcheck.config(state=DISABLED)
            else:
                pingresponse = 0
                if pingresponse == 0:
                    thirdcheck = ttk.Checkbutton(self.thirdrack, text=thirdserver)
                    thirdcheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    thirdbuttons.append(thirdcheck)
                else:
                    thirdcheck = ttk.Checkbutton(self.thirdrack, text=thirdserver)
                    thirdcheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    thirdcheck.config(state=DISABLED)

        def select_third():
            for thirdserver in thirdbuttons:
                thirdserver.invoke()

        selectthird = ttk.Checkbutton(root,command=select_third)
        selectthird.place(x=0,y=335)

        selectthird.invoke()
        selectthird.invoke()


    def build_report(self):

        self.TAB_CONTROL = ttk.Notebook(root)

        self.TAB1 = ttk.Frame(self.TAB_CONTROL)
        self.TAB2 = ttk.Frame(self.TAB_CONTROL)
        self.TAB_CONTROL.add(self.TAB1, text='Tab 1')
        self.TAB_CONTROL.add(self.TAB2, text='Tab 2')

        self.sf1 = ScrolledFrame(self.TAB1)
        self.sf1.pack(fill='y',expand=True)

        self.sf2 = ScrolledFrame(self.TAB2)
        self.sf2.pack(fill='y', expand=True)

        self.TAB_CONTROL.pack(expand='y',fill='both')

        rowno = 0
        for i in range(0,40):
            ttk.Label(self.sf1.inner, text="This is Tab 1").grid(column=rowno, row=rowno, padx=10, pady=0)
            ttk.Label(self.sf2.inner, text="This is Tab 2").grid(column=rowno, row=rowno, padx=10, pady=0)
            rowno += 1 

root = tk.Tk()
Window = mainwindow(root)
root.mainloop()

标签: pythontkinter

解决方案


我将大部分内容更改.pack.grid完成相同布局所需的位置和设置。

from tkinter import *
import os, subprocess
from tkinter import ttk
import tkinter as tk

class ScrolledFrame(tk.Frame):

    def __init__(self, parent, vertical=True, horizontal=True):
        super().__init__(parent)

        # canvas for inner frame
        self._canvas = tk.Canvas(self)
        self._canvas.grid(row=0, column=0, sticky='news') # changed

        # create right scrollbar and connect to canvas Y
        self._vertical_bar = tk.Scrollbar(self, orient='vertical', command=self._canvas.yview)
        if vertical:
            self._vertical_bar.grid(row=0, column=1, sticky='ns')
        self._canvas.configure(yscrollcommand=self._vertical_bar.set)

        # create bottom scrollbar and connect to canvas X
        self._horizontal_bar = tk.Scrollbar(self, orient='horizontal', command=self._canvas.xview)
        if horizontal:
            self._horizontal_bar.grid(row=1, column=0, sticky='we')
        self._canvas.configure(xscrollcommand=self._horizontal_bar.set)

        # inner frame for widgets
        self.inner = tk.Frame(self._canvas)
        self._window = self._canvas.create_window((0, 0), window=self.inner, anchor='nw')

        # autoresize inner frame
        self.columnconfigure(0, weight=1) # changed
        self.rowconfigure(0, weight=1) # changed

        # resize when configure changed
        self.inner.bind('<Configure>', self.resize)

        # resize inner frame to canvas size
        self.resize_width = False
        self.resize_height = False
        self._canvas.bind('<Configure>', self.inner_resize)

    def resize(self, event=None): 
        self._canvas.configure(scrollregion=self._canvas.bbox('all'))

    def inner_resize(self, event):
        # resize inner frame to canvas size
        if self.resize_width:
            self._canvas.itemconfig(self._window, width=event.width)
        if self.resize_height:
            self._canvas.itemconfig(self._window, height=event.height)

managment = ["main","nav","output","outputspare","gateway","sync1","sync2","storinator"]
thirdrack = ["recon01","recon02","recon03","recon04","recon05","recon06","recon07","recon08","recon09","recon10","recon11","recon12","render01","render02"]
FGCs =["fgc01","fgc02","fgc03","fgc04","fgc05","fgc06","fgc07","fgc08","fgc09","fgc10","fgc11","fgc12","fgc13","fgc14","fgc15","fgc16","fgc17","fgc18","fgc19","fgc20","fgc21","fgc22","fgc23","fgc24","fgc25","fgc26","fgc27","fgc28","fgc29","fgc30","fgc31","fgc32","fgc33","fgc34","fgc35","fgc36","fgc37","fgc38","fgcspare1","fgcspare2","fgcspare3","fgcspare4"]
tests = ["Network", "GPU", "Time", "Gidel", "Snapshot", "Disks"]
testbuttons = []
serverbuttons = []
managebuttons = []
fgcbuttons = []
thirdbuttons = []
f=open(os.devnull, 'w')

class mainwindow(tk.Frame):
    def __init__(self,master, *args, **kwargs):
        self.master = master
        super().__init__(master, *args, **kwargs)
        master.title("System Report Tool")
        master.geometry("1000x700")
        # self.reportnotebook = ttk.Notebook(root)
        self.build_tests()
        self.build_manage()
        self.build_fgcs()
        self.build_third()
        self.build_report()

    def build_tests(self):
        self.Tests = ttk.LabelFrame(root, text="  Tests")
        self.Tests.grid(row=0, column=0,sticky='w', padx=10, pady=10)

        rowno = 0
        columnno = 0
        for test in tests:
            if columnno >= 6:
                rowno += 1
                columnno = 0
                testcheck = ttk.Checkbutton(self.Tests, text=test)
                testcheck.grid(row=rowno, column=columnno, sticky='w')
                testbuttons.append(testcheck)
            else:
                rowno = 0
                columnno += 1
                testcheck = ttk.Checkbutton(self.Tests, text=test)
                testcheck.grid(row=rowno, column=columnno, sticky='w')
                testbuttons.append(testcheck)

        def select_tests():
            for test in testbuttons:
                test.invoke()

        selecttests = ttk.Checkbutton(root,command=select_tests)
        selecttests.place(x=0,y=7)

        selecttests.invoke()
        selecttests.invoke()

    def build_manage(self):
        self.Managment = ttk.LabelFrame(root, text="  Managment")
        self.Managment.configure(width=10, height=20)
        self.Managment.grid(row=1, column=0,sticky='w', padx=10, pady=10)


        rowno = 0
        columnno = 0
        for manage in managment:
            if columnno >= 6:
                rowno += 1
                columnno = 0
                # pingresponse=subprocess.call(['ping', '-n', '1', '-w', '1', manage],
                #                              stdout=f,
                #                              stderr=subprocess.STDOUT)
                pingresponse = 0
                if pingresponse == 0:
                    managecheck = ttk.Checkbutton(self.Managment, text=manage)
                    managecheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    managebuttons.append(managecheck)
                else:
                    managecheck = ttk.Checkbutton(self.Managment, text=manage)
                    managecheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    managecheck.config(state=DISABLED)
            else:
                pingresponse = 0
                if pingresponse == 0:
                    managecheck = ttk.Checkbutton(self.Managment, text=manage)
                    managecheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    managebuttons.append(managecheck)

                else:
                    managecheck = ttk.Checkbutton(self.Managment, text=manage)
                    managecheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    managecheck.config(state=DISABLED)

        def select_manage():
            for manage in managebuttons:
                manage.invoke()

        selectmanage = ttk.Checkbutton(root,command=select_manage)
        selectmanage.place(x=0,y=68)

        selectmanage.invoke()
        selectmanage.invoke()

    def build_fgcs(self):
        self.FGCs = ttk.LabelFrame(root, text="  FGCs")
        self.FGCs.configure(width=10, height=20)
        self.FGCs.grid(row=2, column=0,sticky='w', padx=10, pady=10)

        rowno = 0
        columnno = 0
        for fgc in FGCs:
            if columnno >= 6:
                rowno += 1
                columnno = 0
                #pingresponse=subprocess.call(['ping', '-n', '1', '-w', '1', fgc],
                #                            stdout=f,
                #                            stderr=subprocess.STDOUT)
                pingresponse = 0
                if pingresponse == 0:
                    fgccheck = ttk.Checkbutton(self.FGCs, text=fgc)
                    fgccheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    fgcbuttons.append(fgccheck)
                else:
                    fgccheck = ttk.Checkbutton(self.FGCs, text=fgc)
                    fgccheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    fgccheck.config(state=DISABLED)
            else:
                #pingresponse=subprocess.call(['ping', '-n', '1', '-w', '1', fgc],
                #                            stdout=f,
                #                            stderr=subprocess.STDOUT)
                pingresponse = 0
                if pingresponse == 0:
                    fgccheck = ttk.Checkbutton(self.FGCs, text=fgc)
                    fgccheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    fgcbuttons.append(fgccheck)
                else:
                    fgccheck = ttk.Checkbutton(self.FGCs, text=fgc)
                    fgccheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    fgccheck.config(state=DISABLED)

        def select_fgc():
            for fgc in fgcbuttons:
                fgc.invoke()

        selectfgc = ttk.Checkbutton(root,command=select_fgc)
        selectfgc.place(x=0,y=148)

        selectfgc.invoke()
        selectfgc.invoke()

    def build_third(self):
        self.thirdrack = ttk.LabelFrame(root, text="  3rd Rack")
        self.thirdrack.configure(width=25, height=20)
        self.thirdrack.grid(row=3, column=0,sticky='w', padx=10, pady=10)


        rowno = 0
        columnno = 0
        for thirdserver in thirdrack:
            if columnno >= 6:
                rowno += 1
                columnno = 0
                # pingresponse=subprocess.call(['ping', '-n', '1', '-w', '1', thirdserver],
                #                              stdout=f,
                #                              stderr=subprocess.STDOUT)
                pingresponse = 0
                if pingresponse == 0:
                    thirdcheck = ttk.Checkbutton(self.thirdrack, text=thirdserver)
                    thirdcheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    thirdbuttons.append(thirdcheck)
                else:
                    thirdcheck = ttk.Checkbutton(self.thirdrack, text=thirdserver)
                    thirdcheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    thirdcheck.config(state=DISABLED)
            else:
                pingresponse = 0
                if pingresponse == 0:
                    thirdcheck = ttk.Checkbutton(self.thirdrack, text=thirdserver)
                    thirdcheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    thirdbuttons.append(thirdcheck)
                else:
                    thirdcheck = ttk.Checkbutton(self.thirdrack, text=thirdserver)
                    thirdcheck.grid(row=rowno, column=columnno, sticky='w')
                    columnno += 1
                    thirdcheck.config(state=DISABLED)

        def select_third():
            for thirdserver in thirdbuttons:
                thirdserver.invoke()

        selectthird = ttk.Checkbutton(root,command=select_third)
        selectthird.place(x=0,y=335)

        selectthird.invoke()
        selectthird.invoke()


    def build_report(self):

        self.TAB_CONTROL = ttk.Notebook(root)

        self.TAB1 = ttk.Frame(self.TAB_CONTROL)
        self.TAB2 = ttk.Frame(self.TAB_CONTROL)
        self.TAB_CONTROL.add(self.TAB1, text='Tab 1')
        self.TAB_CONTROL.add(self.TAB2, text='Tab 2')

        self.sf1 = ScrolledFrame(self.TAB1)
        self.sf1.pack(fill='y',expand=True)

        self.sf2 = ScrolledFrame(self.TAB2)
        self.sf2.pack(fill='y', expand=True)

        self.TAB_CONTROL.grid(row=0, rowspan=10,column=1,columnspan=10, sticky='news')

        rowno = 0
        for i in range(0,40):
            ttk.Label(self.sf1.inner, text="This is Tab 1").grid(column=rowno, row=rowno, padx=10, pady=0)
            ttk.Label(self.sf2.inner, text="This is Tab 2").grid(column=rowno, row=rowno, padx=10, pady=0)
            rowno += 1 

root = tk.Tk()
Window = mainwindow(root)
root.mainloop()

推荐阅读