python - 需要将画布移动到应用的右侧
问题描述
我到了这一点,但我希望它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()
解决方案
我将大部分内容更改.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()
推荐阅读
- bash - 根据 MacOS 文件夹中的文件名更改文件创建和修改的日期和时间
- .net - 无效的条件编译常量
- python - 用乌龟写作时如何移动到下一行
- json - & 显示在 WP 类别名称中,为什么?
- python - BASH:监控/维护服务器
- python - 是否有与 Borland C 命令 putpixel 等效的 Matplotlib?
- r - 如何在 R 中安装 PolyaGamma 包?
- python - 如何仅选择 scipy.sparse csr_matrix 的某些行?
- javascript - Microsoft.XMLHTTP 不适用于已缩短的 URL
- python - 如何更改我的代码以使字符串不会更改为浮动