Python 需要向FGCs LabelFrame(Tkinter)添加滚动工具栏

Python 需要向FGCs LabelFrame(Tkinter)添加滚动工具栏,python,python-2.7,tkinter,Python,Python 2.7,Tkinter,处理一个内部应用程序,并尝试获取一个滚动条,使其仅指向“FGCs”labelFrame,此外,我需要将框架缩放到应用程序大小 如果有人能帮我重构并创建滚动条,我会很高兴的 我知道我需要创建画布或其他东西,但不知道如何创建 这是我第一次用Tkinter from tkinter import * import os, subprocess from tkinter import ttk managment = ["MAIN","NAV","OUTPUT","OUTPUTSPARE","GATEW

处理一个内部应用程序,并尝试获取一个滚动条,使其仅指向“FGCs”labelFrame,此外,我需要将框架缩放到应用程序大小

如果有人能帮我重构并创建滚动条,我会很高兴的

我知道我需要创建画布或其他东西,但不知道如何创建

这是我第一次用Tkinter

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

managment = ["MAIN","NAV","OUTPUT","OUTPUTSPARE","GATEWAY","Sync1","Sync2"]
servers = ["recon01","recon02","recon03","recon04","recon05","recon06","recon07","recon08","recon09","recon10","recon11","recon12","render01","render02","storinator"]
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 = []


class mainwindow:
    global test    
    global testbuttons
    global managment
    global managebuttons
    global FGCs

    def __init__(self,master):
        self.master = master
        master.title("System Report Tool")
        master.geometry("1000x500")

        self.Tests = ttk.LabelFrame(root, text="Tests")
        self.Tests.pack(expand="no",anchor=W,pady=20)

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

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

        selecttests = ttk.Checkbutton(root, text="Select All",command=select_tests)
        selecttests.place(x=260,y=16)

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

        for manage in managment:
            managecheck = ttk.Checkbutton(self.Managment, text=manage)
            managecheck.pack(side=TOP, anchor="w")
            managebuttons.append(managecheck)

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

        selectmanage = ttk.Checkbutton(self.Managment, text="Select All",command=select_manage)
        selectmanage.pack()

        self.FGCs = ttk.LabelFrame(root, text="FGCs")
        self.FGCs.configure(width=10, height=20)
        self.FGCs.place(x=120,y=80)

        for fgc in FGCs:
            fgccheck = ttk.Checkbutton(self.FGCs, text=fgc)
            fgccheck.pack(side=TOP, anchor="w")
            fgcbuttons.append(fgccheck)

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

        selectfgc = ttk.Checkbutton(self.FGCs, text="Select All",command=select_fgc)
        selectfgc.pack()

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

提前感谢。

使用
类滚动框复制代码

LabelFrame
self.FGCs

self.sf = ScrolledFrame(self.FGCs)
self.sf.pack()
然后将小部件放在
滚动框架的
内部
元素中,而不是像这样放在
self.FGCs中

fgccheck = ttk.Checkbutton(self.sf.inner, text=fgc)

工作代码

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

class ScrolledFrame(tk.Frame):

    def __init__(self, parent, vertical=True, horizontal=False):
        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"]
servers = ["recon01","recon02","recon03","recon04","recon05","recon06","recon07","recon08","recon09","recon10","recon11","recon12","render01","render02","storinator"]
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 = []

class mainwindow:
    global test    
    global testbuttons
    global managment
    global managebuttons
    global FGCs

    def __init__(self,master):
        self.master = master
        master.title("System Report Tool")
        master.geometry("1000x500")

        self.Tests = ttk.LabelFrame(root, text="Tests")
        self.Tests.pack(expand="no", anchor=W, pady=20)

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

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

        selecttests = ttk.Checkbutton(root, text="Select All",command=select_tests)
        selecttests.place(x=260,y=16)

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

        for manage in managment:
            managecheck = ttk.Checkbutton(self.Managment, text=manage)
            managecheck.pack(side=TOP, anchor="w")
            managebuttons.append(managecheck)

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

        selectmanage = ttk.Checkbutton(self.Managment, text="Select All",command=select_manage)
        selectmanage.pack()

        self.FGCs = ttk.LabelFrame(root, text="FGCs")
        self.FGCs.configure(width=10, height=20)
        self.FGCs.place(x=120, y=80)

        self.sf = ScrolledFrame(self.FGCs)
        self.sf.pack()

        for fgc in FGCs:
            fgccheck = ttk.Checkbutton(self.sf.inner, text=fgc)
            fgccheck.pack(side=TOP, anchor="w")
            fgcbuttons.append(fgccheck)

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

        selectfgc = ttk.Checkbutton(self.sf.inner, text="Select All",command=select_fgc)
        selectfgc.pack()

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

滚动条
不适用于
框架
。您必须搜索如何使用
Canvas
Frame
滚动的示例。它被称为
“ScrolledCanvas”
“ScrolledFrame”
而不是使用
global
,您应该在类中创建变量并使用
self。
Gitube上的示例我知道Scrollbar在Frame上不起作用。这就是我创建这个问题的原因。如果有人能帮我找到这个问题的解决方案,我会很高兴的。只有一个问题,为什么滚动条和框架没有随着应用程序的调整而改变?滚动条在
FGCs
中,它使用
place()
将其放在窗口中,并且
place()
从不调整小部件的大小。您必须使用
self.FGCs.pack(fill='y',expand=True)
,它将自动调整窗口中的
FGC
。然后您还需要
self.sf.pack(fill='y',expand=True)
自动调整
ScrollbarFrame
内部
FGCs
的大小。但是它也会移动“FGC”,所以它可能需要
pack(…,side='left',anchor='w')
我添加了一些更改的代码。您可以使用类似的工具来比较两个版本,并查看更改了什么。
import os
import subprocess
import tkinter as tk
from tkinter import *
from tkinter import ttk

class ScrolledFrame(tk.Frame):

    def __init__(self, parent, vertical=True, horizontal=False):
        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"]
servers = ["recon01","recon02","recon03","recon04","recon05","recon06","recon07","recon08","recon09","recon10","recon11","recon12","render01","render02","storinator"]
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 = []

class mainwindow:
    global test    
    global testbuttons
    global managment
    global managebuttons
    global FGCs

    def __init__(self,master):
        self.master = master
        master.title("System Report Tool")
        master.geometry("1000x500")

        # --- top ---

        self.Tests = ttk.LabelFrame(root, text="Tests")
        self.Tests.pack(anchor='w', pady=20)

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

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

        selecttests = ttk.Checkbutton(root, text="Select All",command=select_tests)
        selecttests.place(x=260,y=16)

        # --- middle ---

        self.Managment = ttk.LabelFrame(root, text="Managment")
        self.Managment.configure(width=10, height=20)
        self.Managment.pack(anchor='nw', side='left')

        for manage in managment:
            managecheck = ttk.Checkbutton(self.Managment, text=manage)
            managecheck.pack(anchor="w")
            managebuttons.append(managecheck)

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

        selectmanage = ttk.Checkbutton(self.Managment, text="Select All",command=select_manage)
        selectmanage.pack()

        self.FGCs = ttk.LabelFrame(root, text="FGCs")
        self.FGCs.configure(width=10, height=20)
        self.FGCs.pack(fill='y', expand=True, side='left', anchor='w')

        self.sf = ScrolledFrame(self.FGCs)
        self.sf.pack(fill='y', expand=True)

        for fgc in FGCs:
            fgccheck = ttk.Checkbutton(self.sf.inner, text=fgc)
            fgccheck.pack(anchor="w")
            fgcbuttons.append(fgccheck)

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

        selectfgc = ttk.Checkbutton(self.sf.inner, text="Select All", command=select_fgc)
        selectfgc.pack()


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