2016-12-07 1 views
1

파이썬/tkinter에서 궁극적으로 작은 터치 스크린 디스플레이 (480x320px)가 첨부 된 라즈베리 파이에서 실행해야하는 응용 프로그램을 만들려고합니다. 화면은 메인 프레임과 프레임 (나중에)에 6 개의 기능 키 (버튼)가 포함될 프레임으로 나뉩니다.tkinter 프레임 표시 기본 사항

그래서 아래 코드로 시작 했으므로 어떻게 든 메인 애플리케이션 창을 두 프레임 하나는 회색이고 하나는 검정색입니다. 그러나 (내 PC에서) 보이는 것은 올바른 크기 (크기가 너무 작음)가 아닌 올바른 크기의 메인앱 창과 노란색 배경입니다. MainApp 내부에 정의 된 프레임은 표시되지 않습니다. 라벨이 안에 있더라도 접착 성이 있습니다. 무게가 있습니다. 내가 시도한 것 이외에 다른 것을 기억할 수 없습니다.

나는 무엇을 간과하고 있습니까? 제발요?

#!/usr/bin/python3 
import tkinter as tk 
# 
# main application 
# 
class MainApp(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.parent = parent 
     self.parent.title("My first GUI") 
     self.parent.geometry("480x320") 
     self.parent.resizable(width=False, height=False) 
     self.parent.config(bg="yellow") 

     mainframe = tk.Frame(self, bg="grey", width=480, height=280) 
     mainframe.grid(column=0, row=0, sticky="WENS") 
     tk.Label(mainframe, text="co-cooo").grid(column=0, row=0, sticky="WENS") 

     fkeyframe = tk.Frame(self, bg="black", width=480, height=40) 
     fkeyframe.grid(column=0, row=1, sticky="WENS") 
     tk.Label(fkeyframe, text="fo-fooo").grid(column=0, row=0, sticky="WENS") 

     self.rowconfigure(0, weight=1, minsize=280) 
     self.rowconfigure(1, weight=1, minsize=40) 
# 
# define root element and start application 
# 
def main(): 
    root = tk.Tk() 
    app = MainApp(root) 
    root.mainloop() 

# 
# start if called from command line 
# 
if __name__ == '__main__': 
    main() 

#  0,0 MainApp (yellow)   480,0 
#  +---------------------------------+ 
#  | mainframe (grey, h=280)  | 
#  |+-------------------------------+| 
#  ||        || 
#  ||        || 
#  ||        || 
#  |+-------------------------------+| 
#  | fkeyframe (black, h=40)  | 
#  |+-------------------------------+| 
#  ||+----+----+----+----+----+----+|| 
#  ||| Bt | Bt | Bt | Bt | Bt | Bt ||| 
#  ||+----+----+----+----+----+----+|| 
#  |+-------------------------------+| 
#  +---------------------------------+ 
# 320,0        320,480 

답변

0

__init__에서 사용 frame.grid_propagate(False)은 내부 위젯의 크기로 프레임의 크기를 조정 방지 :

def __init__(self, parent): 
    tk.Frame.__init__(self, parent) 
    self.parent = parent 
    self.parent.title("My first GUI") 
    self.parent.geometry("480x320") 
    self.parent.resizable(width=False, height=False) 
    self.parent.config(bg="yellow") 

    mainframe = tk.Frame(self, bg="grey", width=480, height=280) 
    mainframe.grid(column=0, row=0, sticky="WENS") 
    mainframe.grid_propagate(False) 
    tk.Label(mainframe, text="co-cooo").grid(column=0, row=0, sticky="WENS") 

    fkeyframe = tk.Frame(self, bg="black", width=480, height=40) 
    fkeyframe.grid(column=0, row=1, sticky="WENS") 
    mainframe.grid_propagate(False) 
    tk.Label(fkeyframe, text="fo-fooo").grid(column=0, row=0, sticky="WENS") 

    self.rowconfigure(0, weight=1, minsize=280) 
    self.rowconfigure(1, weight=1, minsize=40) 
+0

부분 개선 ... 이제는 회색과 검정색으로 표시되어 MainApp 창의 왼쪽에 overlaying labels co-cooo & fo-fooo가 표시되고 나머지는 여전히 노란색으로 표시됩니다 (약 80 %) ...그래서 프레임은 내가 요청한 폭을 존중하지 않는 것처럼 보입니다. – MikeD

+1

업데이트 된 답변, 프레임의'grid_propagate' 메소드보세요. – Fejs

+0

나는 중복 코드라고 생각하는 것을 줄이기 시작했다. 그래서'self.grid()'는 실제로 매우 좋았다. 나는 이제 새로운 현상에 뛰어 들고있다. 그래서 나는 당신의 답을 받아 들여서, 10보다 높은 레벨로 올라간다.^6 – MikeD

2

당신은 바른 길에 있습니다. 체계적으로 진행되는 중이며 모든 위젯을 화면에 놓고 수정하려고 시도하는 대신 한 번에 하나의 레이아웃 문제 만 해결하려고합니다. 그것은 당신이 시작할 때 확실히 일하는 가장 좋은 방법입니다.

첫 번째 문제는 MainApp을 주 창에 추가하는 것을 게을리합니다. 당신이 그것을 만들지 만, 당신은 화면에 그것을 레이아웃하지 않습니다.

그래서 첫 번째 단계는 주 창에 추가하는 것입니다. 생성 후 pack 또는 place 또는 grid을 호출하여이 작업을 수행하십시오. 이 루트 창 내부에만 위젯의 때문에, pack는 간단합니다 : MainApp와 모든 자식의 원인이됩니다

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

이 볼 수 있도록.

두 번째 문제는 모든 항목이 현재 압축되어 있고 창 왼쪽에 있음을 알 수 있습니다. 이는 mainframeMainApp 안에 넣고 grid으로 설정했기 때문에, MainApp에 열을 지정하지 않았기 때문에 전체적으로 창에있는 모든 여분의 공간이 사용되지 않게됩니다. 프레임이 내용에 맞게 축소되기를 원하기 때문에 프레임이 내부에있는 위젯에 맞게 가로로 축소됩니다.

부모 위젯에 하나 이상의 위젯을 배치하는 경우 부모 위젯에 하나의 행인 행 을 항상 하나씩 올려야합니다.

그렇게하려면, 당신은 grid_rowconfigure 전화를 많이처럼 columnconfigure 전화 : 그와

self.columnconfigure(0, weight=1) 

, 당신은 이제 윈도우의 전체 상부를 커버 mainframefkeyframe 하단 부분을 커버하고 시작할 수 있습니다 더 많은 위젯을 추가했습니다.