2017-11-04 5 views
0

사용자가 창 가장자리에서 '클릭하여 끌기'를 사용하여 창 크기를 조정할 때 캔버스가 전체 창을 채울 수 있도록 캔버스의 크기를 조정 하려는데 성공하지 못했습니다.파이썬 tkinter 프레임 캔버스 크기 조정

나는 다음과 같은 다른 질문을 살펴 보았다 :

질문 # 1 (이전에 게시하지만, 여기에 도움이되지 않습니다) 나는 구성을 결합하기 때문에

이것은 내가 올바른 방향으로 무슨 생각으로 나를 보내 캔버스에. 그러나 "캔버스가 FrameWidth에 정의되어 있지 않습니다."라는 오류가 나타납니다. "FrameWidth (1)없는 위치 인수가 필요합니다 : 형식 오류는 '캔버스'를"나는 함수 호출 및 기능을 수정하는 경우

Tkinter: How to get frame in canvas window to expand to the size of the canvas?

, 그때 내가 그 오류 수정은

canvas.bind('<Configure>', self.FrameWidth(canvas)) 

def FrameWidth(self, event, canvas): 
입니다

:

질문 # 2 (이전에 게시하지만, 여기에 도움이되지는)

나는이 질문을 보았다

하지만이 질문은 잘못 움직이는 스크롤바를 다루고 있습니다.

질문 # 3 (이전에 게시하지만, 여기에 도움이되지 않습니다)

나는이 질문에 고개 무게 = 1에 넣어, 그러나 그것은 도움이되지 않은 :

Python TKinter: frame and canvas will expand horizontally, but not vertically, when window is resized

하나를 조언을 부탁드립니다.

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 
""" 
Created on Fri Nov 3 04:39:43 2017 

@author: davidc 
""" 

import tkinter as tk 


class Selections(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 

     self.FifthLabelLeft = tk.Label(self, 
         text="""Riding""", 
         justify = tk.CENTER, 
         width=20, 
         padx = 10).grid(row=4, column = 0, pady=5) 

     self.FifthLabelCenter = tk.Label(self, 
         text="""Winning Candidate""", 
         justify = tk.CENTER, 
         width=20, 
         padx = 10).grid(row=4, column = 1, pady=5) 

     self.FifthLabelRight = tk.Label(self, 
         text="""Percent of Vote""", 
         justify = tk.CENTER, 
         width=10, 
         padx = 10).grid(row=4, column = 2, pady=5) 

     mybox = tk.LabelFrame(self, padx=5, pady=4) 
     mybox.grid(row=5, column=0, columnspan=3) 

     canvas = tk.Canvas(mybox, borderwidth=5, background="#70ff33") 
     frame = tk.Frame(canvas, background="#33f4ff") 
     vsb = tk.Scrollbar(mybox, orient="vertical", command=canvas.yview) 
     canvas.configure(yscrollcommand=vsb.set, width=450, heigh=30)  

     mybox.grid_columnconfigure(5,weight=1) 
     mybox.grid_rowconfigure(5,weight=1) 
     frame.grid_columnconfigure(5,weight=1) 
     frame.grid_rowconfigure(5,weight=1) 

     vsb.pack(side="right", fill="y") 
     canvas.pack(side="left", fill="both", expand=True) 
     canvas.create_window((4,4), window=frame, anchor="nw", tags="frame") 

     # be sure that we call OnFrameConfigure on the right canvas 
     frame.bind("<Configure>", lambda event: self.OnFrameConfigure(canvas)) 
     canvas.bind('<Configure>', self.FrameWidth) 

     self.fillWindow(frame) 

     self.QuitButton = tk.Button(self, 
            text="QUIT", 
            command=root.destroy, 
            padx=25, pady=0) 
     self.QuitButton.grid(column = 0, columnspan=3) 


    def fillWindow(self, frame): 
     PartyWinnersList = [['Some list of places', "Somebody's Name", 0.37448599960838064], 
          ['A shorter list', 'Three Long Names Here', 0.52167817821240514], 
          ['A much longer, longer entry', 'Short Name', 0.41945832387008858]] 
     placement = 2 
     for i in PartyWinnersList: 
      ShowYear = tk.Label(frame, 
             text="""%s """ % i[0], 
             width=20, 
            ) 
      ShowYear.grid(row=placement, column = 0, sticky=tk.S) 
      ShowSystem = tk.Label(frame, 
             text="""%s """ % i[1], 
             width=20, 
            ) 
      ShowSystem.grid(row=placement, column = 1, sticky=tk.N) 
      PercentVotes = i[2]*100 
      ShowVotes = tk.Label(frame, 
             text="""%3.1f""" % PercentVotes, 
             width=10, 
            ) 
      ShowVotes.grid(row=placement, column = 2, sticky=tk.N) 
      placement += 1 

    def FrameWidth(self, event): 
     canvas_width = event.width 
     canvas.itemconfig(self.canvas_frame, width = canvas_width) 

    def OnFrameConfigure(self, canvas): 
     canvas.configure(scrollregion=canvas.bbox("all")) 


if __name__ == "__main__": 
    root = tk.Tk() 
    main = Selections(root) 
    main.pack(side="top", fill="both", expand=True) 
    root.mainloop() 
+0

실제로 무엇을하려고합니까? 전체 창을 채울 수 있도록 캔버스 크기를 조정 하시겠습니까? – SneakyTurtle

+0

예, 사용자가 창 가장자리에서 '클릭하여 끌기'를 사용하여 창 크기를 조정할 때 캔버스가 전체 창을 채울 수 있도록 캔버스의 크기를 조정하십시오. –

답변

0

여기에 바퀴를 재발견 할 필요가 없습니다 :

여기 내 MWE입니다. Canvas()은 tkinter 위젯이며 모든 tkinter 위젯과 마찬가지로 geometry manager를 사용하여 창에 그려야합니다. 즉, 창에 어떻게 나타나는지 조작 할 수 있습니다.

아래 예제 프로그램은 this page에있는 예제에서 수정되었습니다. 우리는 .pack()를 사용하는 경우

우리는 다음과 같은 것을 수행 할 수 있습니다

fill="both"expand=True의 조합이 창에 주어진 것 모든 여분의 공간을 먹고 채우기 위해 확장 위젯을 알려줍니다
from tkinter import * 

root = Tk() 

w = Canvas(root, width=200, height=100) 
w.pack(fill="both", expand=True) 

w.create_line(0, 0, 200, 100) 
w.create_line(0, 100, 200, 0, fill="red", dash=(4, 4)) 

w.create_rectangle(50, 25, 150, 75, fill="blue") 

root.mainloop() 

그것.높은 가중치를 가지고 여기에 우리가 행 0 (우리의 캔버스가) 열 영에게 .rowconfigure().columnconfigure를 사용

from tkinter import * 

root = Tk() 

root.columnconfigure(0, weight=1) 
root.rowconfigure(0, weight=1) 

w = Canvas(root, width=200, height=100) 
w.grid(sticky=N+S+E+W) 

w.create_line(0, 0, 200, 100) 
w.create_line(0, 100, 200, 0, fill="red", dash=(4, 4)) 

w.create_rectangle(50, 25, 150, 75, fill="blue") 

root.mainloop() 

: 우리가 .grid()를 사용하는 경우

우리는 조금 다른 뭔가를해야 다른 행이나 열보다 더 많은 여유 공간이 주어진다는 것을 의미합니다 (이 경우에는 다른 행이나 열의 존재가 전혀없는 것처럼 보입니다). 그런 다음 실제로 위젯에 확장을 지시해야합니다 그 셀이 상주하는 "셀"을 지정합니다. sticky=N+S+E+W을 지정하면 위젯이 확장 될 때 셀의 모든 4 가장자리를 고수하도록 지시되어 위젯을 확장합니다.