Python 为什么画布不使用滚动条滚动并在添加小部件时自动调整大小?
当我将小部件放在画布中时,小部件绕过画布大小。但当我滚动时,画布不会移动。Python 为什么画布不使用滚动条滚动并在添加小部件时自动调整大小?,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,当我将小部件放在画布中时,小部件绕过画布大小。但当我滚动时,画布不会移动。 最重要的是,当我添加更多小部件时,画布会自动重新调整大小。我以为画布不应该重新调整大小,因为我已经添加了一个滚动条 这是我的密码: from tkinter import * from tkinter import ttk import mysql.connector class CanvasScroll: def on_resize(self,event): self.canvas.conf
最重要的是,当我添加更多小部件时,画布会自动重新调整大小。我以为画布不应该重新调整大小,因为我已经添加了一个滚动条 这是我的密码:
from tkinter import *
from tkinter import ttk
import mysql.connector
class CanvasScroll:
def on_resize(self,event):
self.canvas.config(width = 1185, height = 530)
def add_crew(self):
crewFrame = CrewFrame()
def callback_list(self):
index = self.notebook.index(self.notebook.select()) + 1
self.tmpframe = Try2(self.contentframe, index)
def __init__(self, master):
self.canvas = Canvas(master, width = 1185, height = 530, scrollregion = (0, 0, 1216, 700), bg = 'white', confine = True)
self.canvas.grid(row = 2, column = 0, sticky = 'news')
self.xscroll = ttk.Scrollbar(master, orient = HORIZONTAL, command = self.canvas.xview)
self.xscroll.grid(row = 3, column = 0, sticky = 'we')
self.yscroll = ttk.Scrollbar(master, orient = VERTICAL, command = self.canvas.yview)
self.yscroll.grid(row = 2, column = 1, sticky = 'ns')
self.canvas.config(xscrollcommand = self.xscroll.set, yscrollcommand = self.yscroll.set)
self.canvas.bind("<Configure>", self.on_resize)
self.option = ttk.Frame(master, height = 150, width = 1206)
self.option.grid(row = 0, column = 0, sticky = 'we', columnspan = 5)
self.addicon = PhotoImage(file = 'C:\\Users\\rain\\Desktop\\Fyosh!\\logo\\add.gif').subsample(2,2)
self.btnAdd = ttk.Button(self.option, image = self.addicon, text = 'Add Crew', compound = TOP, command = self.add_crew)
self.btnAdd.grid(row = 0, column = 0, padx = 50, pady = 5)
self.updateicon = PhotoImage(file = 'C:\\Users\\rain\\Desktop\\Fyosh!\\logo\\update.gif').subsample(2,2)
self.btnUpdate = ttk.Button(self.option, image = self.updateicon, text = 'Update Crew', compound = TOP)
self.btnUpdate.grid(row = 0, column = 1, padx = 50)
self.deleteicon = PhotoImage(file = 'C:\\Users\\rain\\Desktop\\Fyosh!\\logo\\delete.gif').subsample(2,2)
self.btnDelete = ttk.Button(self.option, image = self.deleteicon, text = 'Delete Crew', compound = TOP)
self.btnDelete.grid(row = 0, column = 2, padx = 50)
self.reloadicon = PhotoImage(file = 'C:\\Users\\rain\\Desktop\\Fyosh!\\logo\\Refresh.png').subsample(7,7)
self.reloadbtn = ttk.Button(self.option, image = self.reloadicon, command = self.callback_list, text = 'Load List', compound = TOP)
self.reloadbtn.grid(row = 0, column = 3, padx = 50)
self.tabframe = ttk.Frame(master, height = 20)
self.tabframe.grid(row = 1, sticky = 'we')
self.notebook = ttk.Notebook(self.tabframe)
self.notebook.grid(row = 0, column = 0, sticky = 'we')
db = mysql.connector.connect(user = 'root', password = '', host = 'localhost', database = 'fat2x_payroll')
cursor = db.cursor()
ships = ("SELECT * from tbl_shiplist")
try:
cursor.execute(ships)
result = cursor.fetchall()
self.tab = {}
for row in result:
self.tab[row[0]] = {
"shipname": ttk.Frame(self.notebook)
}
self.notebook.add(self.tab[row[0]]["shipname"], text = row[1])
db.close()
except:
messagebox.showinfo("alert", "ship list error")
self.canvas.label = ttk.Label(self.canvas, text = "hahahahahha").grid(column = 0)
self.canvas.label1 = ttk.Label(self.canvas, text = "hahahahahha").grid(column = 1)
self.canvas.label2 = ttk.Label(self.canvas, text = "hahahahahha").grid(column = 2)
self.canvas.label3 = ttk.Label(self.canvas, text = "hahahahahha").grid(column = 3)
self.canvas.label4 = ttk.Label(self.canvas, text = "hahahahahha").grid(column = 4)
self.canvas.label5 = ttk.Label(self.canvas, text = "hahahahahha").grid(column = 5)
self.canvas.label6 = ttk.Label(self.canvas, text = "hahahahahha").grid(column = 6)
self.canvas.label7 = ttk.Label(self.canvas, text = "hahahahahha").grid(column = 7)
self.canvas.label8 = ttk.Label(self.canvas, text = "hahahahahha").grid(column = 8)
def start():
master = Tk()
master.geometry("1206x690+10+10")
master.resizable(0,0)
master.title("Crew Panel")
canvasScroll = CanvasScroll(master)
if __name__ == "__main__":
start()
从tkinter导入*
从tkinter导入ttk
导入mysql.connector
课堂拉票:
def on_resize(自我,事件):
self.canvas.config(宽度=1185,高度=530)
def添加_乘员(自身):
crewFrame=crewFrame()
def回调_列表(自身):
index=self.notebook.index(self.notebook.select())+1
self.tmpframe=Try2(self.contentframe,索引)
定义初始(自我,主):
self.canvas=canvas(主控,宽度=1185,高度=530,滚动区域=(0,0126700),背景='white',限制=True)
self.canvas.grid(行=2,列=0,粘性='news')
self.xscroll=ttk.Scrollbar(master,orient=HORIZONTAL,command=self.canvas.xview)
self.xscroll.grid(行=3,列=0,粘性='we')
self.yscroll=ttk.Scrollbar(master,orient=VERTICAL,command=self.canvas.yview)
self.yscroll.grid(行=2,列=1,粘性='ns')
self.canvas.config(xscrollcommand=self.xscroll.set,yscrollcommand=self.yscroll.set)
self.canvas.bind(“,self.on_resize)
self.option=ttk.Frame(主控,高度=150,宽度=1206)
self.option.grid(行=0,列=0,粘性=we,列span=5)
self.addicon=PhotoImage(文件='C:\\Users\\rain\\Desktop\\Fyosh!\\logo\\add.gif')。子样本(2,2)
self.btnAdd=ttk.按钮(self.option,image=self.addicon,text='Add Crew',composite=TOP,command=self.Add_Crew)
self.btnAdd.grid(行=0,列=0,padx=50,pady=5)
self.updateicon=PhotoImage(文件='C:\\Users\\rain\\Desktop\\Fyosh!\\logo\\update.gif')。子样本(2,2)
self.btnUpdate=ttk.Button(self.option,image=self.updateicon,text='Update Crew',component=TOP)
self.btnUpdate.grid(行=0,列=1,padx=50)
self.deleteicon=PhotoImage(文件='C:\\Users\\rain\\Desktop\\Fyosh!\\logo\\delete.gif')。子样本(2,2)
self.btnDelete=ttk.按钮(self.option,image=self.Delete图标,text='Delete Crew',composite=TOP)
self.btnDelete.grid(行=0,列=2,padx=50)
self.reloadicon=PhotoImage(文件='C:\\Users\\rain\\Desktop\\Fyosh!\\logo\\Refresh.png')。子样本(7,7)
self.reloadbtn=ttk.Button(self.option,image=self.reloadcon,command=self.callback\u list,text='Load list',composite=TOP)
self.reloadbtn.grid(行=0,列=3,padx=50)
self.tabframe=ttk.Frame(主控,高度=20)
self.tabframe.grid(行=1,粘性='we')
self.notebook=ttk.notebook(self.tabframe)
self.notebook.grid(行=0,列=0,粘性='we')
db=mysql.connector.connect(用户='root',密码='',主机='localhost',数据库='fat2x_payroll')
cursor=db.cursor()
发货=(“从tbl_发货清单中选择*)
尝试:
cursor.execute(船舶)
结果=cursor.fetchall()
self.tab={}
对于结果中的行:
self.tab[第[0]行]={
“shipname”:ttk.Frame(self.notebook)
}
self.notebook.add(self.tab[第[0]行][“shipname”],text=第[1]行)
db.close()
除:
messagebox.showinfo(“警报”,“发货列表错误”)
self.canvas.label=ttk.label(self.canvas,text=“hahahahaha”).grid(column=0)
self.canvas.label1=ttk.Label(self.canvas,text=“hahahahaha”).grid(column=1)
self.canvas.label2=ttk.Label(self.canvas,text=“hahahahaha”).grid(column=2)
self.canvas.label3=ttk.Label(self.canvas,text=“hahahahaha”).grid(column=3)
self.canvas.label4=ttk.Label(self.canvas,text=“hahahahaha”).grid(column=4)
self.canvas.label5=ttk.Label(self.canvas,text=“hahahahaha”).grid(column=5)
self.canvas.label6=ttk.Label(self.canvas,text=“hahahahaha”).grid(column=6)
self.canvas.label7=ttk.Label(self.canvas,text=“hahahahaha”).grid(column=7)
self.canvas.label8=ttk.Label(self.canvas,text=“hahahahaha”).grid(column=8)
def start():
master=Tk()
主几何(“1206x690+10+10”)
主。可调整大小(0,0)
船长职务(“船员小组”)
画布卷轴=画布卷轴(主)
如果名称=“\uuuuu main\uuuuuuuu”:
开始()
画布只能滚动嵌入在画布上的对象。对于小部件,这意味着您已经为希望受滚动条影响的小部件调用了画布方法
如果您想使用grid
组织小部件,并且希望这些小部件位于可滚动的容器中,通常的方法是将这些小部件放在一个框架内,然后使用create_窗口将框架添加到画布中。您可以在以下答案中看到此技术的一个示例:
至于自动调整大小,此行为与使用滚动条完全无关。如果在小部件上使用grid
或pack
,则除非关闭几何体传播,否则父级将始终调整大小。无论是画布、框架、顶层还是任何其他类型的小部件,这都无关紧要