위젯을 추가 할 때 스크롤바 및 자동 크기 조정으로 캔버스가 스크롤되지 않는 이유는 무엇입니까?

계통 기

캔버스 안에 위젯을 넣으면 위젯이 캔버스 크기를 우회합니다. 하지만 스크롤하면 캔버스가 움직이지 않습니다.
또한 위젯을 추가하면 캔버스의 크기가 자동으로 조정됩니다. 이미 스크롤바를 추가했기 때문에 캔버스 크기가 조정되지 않아야한다고 생각 했습니까?

내 코드는 다음과 같습니다.

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()
브라이언 오클리

캔버스는 캔버스에 포함 된 개체 만 스크롤 할 수 있습니다. 위젯의 경우 스크롤바의 영향을받을 위젯에 대해 캔버스 create_window 메서드를 호출했음을 의미합니다 .

grid위젯을 구성하는 데 사용 하고 이러한 위젯을 스크롤 가능한 컨테이너에 두려는 경우 일반적인 방법은 해당 위젯을 프레임 안에 넣은 다음 create_window를 사용하여 프레임을 캔버스에 추가하는 것입니다. 이 답변에서이 기술의 예를 볼 수 있습니다. https://stackoverflow.com/a/3092341/7432

자동 크기 조정의 경우이 동작은 스크롤바 사용과는 전혀 관련이 없습니다. grid또는 pack위젯 을 사용하는 경우 지오메트리 전파를 끄지 않는 한 상위 항목의 크기가 항상 조정됩니다. Canvas, Frame, Toplevel, 기타 위젯 클래스는 중요하지 않습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관