2017-10-23 8 views
0

그래서 나는 도전적으로 이해할 수없는 것을 찾아 냈습니다. 도움이 필요합니다. 나는 두 개의 버튼을 모두 다음 프레임으로 보내고 그들은 잘 작동하지만, 창 크기를 조정할 때 그들은 같은 크기로 유지하고 왼쪽 상단 모서리에 머물러 있으며, 화면의 중앙에 자아를 배치하기를 원합니다. 성장에 대한 모범이 있다면, 그것은 또한 높이 평가 될 것이지만 반드시 필요한 것은 아닙니다. 또한 가능하다면 그리드를 고수하고 싶습니다. 난 columnconfigure를 시도하고 다른 프레임에 프레임을 배치, 아무것도 작동하지 않는 것. 이상하게도 tho 내가 자기와 용기를 교체하고 버튼에 자기를 떨어 뜨린다면 작동하지만 명령이 작동하지 않으면 누군가 나에게 이것을 설명하거나 내가 뭘 잘못하고 있는지에 대한 좋은 예를 들어 줄 수 있을까? 코드의창 크기에 따라 tkinter 격자 크기가 조정되지 않습니다.

샘플 :

import tkinter as tk 
class MYapp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     container = tk.Frame(self) 
     container.grid(row = 0,column = 0, sticky = "nsew") 
     container.rowconfigure(0, weight = 1) 
     container.columnconfigure(0, weight = 1) 
     container.columnconfigure(1, weight = 1) 
     self.frames = {} 
     for FRAME in (N1, N2): 
      frame = FRAME(container, self) 
      self.frames[FRAME] = frame 
      frame.grid(row = 0, column = 0, sticky = "nsew") 
     self.show_frame(N1) 
    def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 
class N1(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     a = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2)) 
     a.grid(row = 0, column = 0, sticky = "nsew") 
     c = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2)) 
     c.grid(row = 0, column = 1, sticky = "nsew") 
class N2(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     b = tk.Button(self, text = "N2") 
     b.grid(row = 0, column = 0, sticky = "nsew") 
if __name__ == "__main__": 
    app = MYapp() 
    app.mainloop() 

이 해결 : 브라이언에 감사합니다. 답변이있는 업데이트 된 코드입니다.

import tkinter as tk 
class MYapp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     container = tk.Frame(self) 
     container.pack(fill="both", expand=True) 
     container.rowconfigure(0, weight = 1) 
     container.columnconfigure(0, weight = 1) 
     self.frames = {} 
     for FRAME in (N1, N2): 
      frame = FRAME(container, self) 
      self.frames[FRAME] = frame 
      frame.grid(row = 0, column = 0, sticky = "nsew") 
      frame.rowconfigure(0, weight = 1) 
      frame.columnconfigure(0, weight = 1) 
      frame.columnconfigure(1, weight = 1) 
     self.show_frame(N1) 
    def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 
class N1(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     a = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2)) 
     a.grid(row = 0, column = 0, sticky = "nsew") 
     c = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2)) 
     c.grid(row = 0, column = 1, sticky = "nsew") 
class N2(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     b = tk.Button(self, text = "N2") 
     b.grid(row = 0, column = 0, sticky = "nsew") 
if __name__ == "__main__": 
    app = MYapp() 
    app.mainloop() 
+0

당신은 그들이 같은 크기를 유지하고 왼쪽 상단 모퉁이에 머물 렀지 만 당신이 원하는 것을 진술하지 않았습니까? 그들은 중심에 있어야합니까? 창문으로 자라나요? 상단에있어? 바닥에 머물러 계세요? 중간에 여분의 공간을 넣으시겠습니까? –

+0

내 사과, 내 질문을 업데이 트하겠습니다. 나는 그 (것)들을 중심에두기 바랐다. 또한 그들에게 성장한 모범이 도움이 될 것입니다. – kytexaranort

답변

1

당신이 선호하는 행동이 아니라, 그것이하는 일이 잘못되었다는 것입니다. 나는이 제안이 당신이 원하는 것을 할 것인지 아닌지를 모른다.

일반적으로 grid을 사용할 때 관리되는 위젯을 포함하는 상위에 대해 하나 이상의 행과 하나의 열에 항상 가중치를 지정해야합니다. 컨테이너에서 위젯을 사용하는 동안 루트 창에서는 위젯을 사용하지 않습니다. 따라서 위젯 안에 컨테이너의 크기가 제대로 조정되었지만 컨테이너 자체의 크기가 조정되지 않았기 때문에 컨테이너를 볼 수 없습니다.

하나의 위젯 만 다른 위젯에 넣으려면 한 줄의 코드로 모든 것을 할 수 있기 때문에 pack을 사용하는 것이 좋습니다. 따라서, 나는 용기 자체에 대한 pack보다는 grid를 사용하는 것이 좋습니다 : 컨테이너는 하나의 행과 하나의 열을 갖고있는 것 같아요 때문에

container.pack(fill="both", expand=True) 

또한, 당신은 아마 1 열에게 무게를주고 싶지 않아 .

마지막으로 grid을 사용하여 각 페이지 (N1, N2)의 위젯을 관리하지만, 다시 말해서 해당 프레임 내부의 행이나 열에 가중치를 지정하는 것을 잊어 버리는 것입니다.

+0

내가 뭘 잘못했는지 생각해 봅니다. 저는 container.grid를 제공된 팩 줄로 바꾼 다음 frame.grid에 가중치를 추가했으며 지금까지는 샘플과 완벽하게 작동합니다. 브라이언 감사합니다. – kytexaranort

0

그리드 기능은 그 위치를 유지합니다. 당신을 도울 수있는 팩 기능을 사용할 수 있습니다. Tkinter가 쉽게하지 못하는 것입니다.