Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么画布不使用滚动条滚动并在添加小部件时自动调整大小?_Python_Tkinter_Tkinter Canvas - Fatal编程技术网

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
,则除非关闭几何体传播,否则父级将始终调整大小。无论是画布、框架、顶层还是任何其他类型的小部件,这都无关紧要