문제

뭔가가 다음과 같 팩 새로운 라인에 대한 Tk 형상 관리자란?내가 사용하 팩을 넣어 위젯 내부 프레임입니다.에서 높은 해상도의 화면 위젯에 맞게 찾을 수 있습니다.그러나 만약 당신이 그것으로 작은 화면 위젯 방에서 실행됩니다.

기본적으로,우리는 우리에서 이동:

Before

하기:

after

당신이 볼 수 있는 방법은 나의 프로세서 입력 필드입니다.관련 코드:

options_frame = ttk.LabelFrame(
        parent_frame, text="Blast Options")
options_frame.pack(side=TOP, fill=X, expand=1, padx=5, pady=5)
        self._set_up_blast_options(options_frame)

def _set_up_blast_options(self, options_frame):
    self.evalue = Tkinter.DoubleVar()
    self.evalue.set(1)
    self.word_size = Tkinter.IntVar()
    self.word_size.set(4)
    self.penalty_mismatch = Tkinter.DoubleVar()
    self.penalty_mismatch.set(-4)
    self.min_d_match = Tkinter.IntVar()
    self.min_d_match.set(5)
    self.proc_count = Tkinter.IntVar()
    self.proc_count.set(cpu_count())

    # evalue
    e_value_label = ttk.LabelFrame(
        options_frame, text="e-Value Threshold")
    e_value_entry = ttk.Entry(e_value_label)
    e_value_entry.insert(0, self.evalue.get())
    e_value_entry.bind('<Return>', self._validate_e_value)
    e_value_entry.bind('<FocusOut>', self._validate_e_value)
    e_value_label.pack(side=LEFT, expand=1, pady=5, padx=5, fill=X)
    e_value_entry.pack(side=TOP, expand=1, pady=5, padx=5, fill=X)

    # word size
    word_size_label = ttk.LabelFrame(
        options_frame, text="Word Size")
    word_size_entry = ttk.Entry(word_size_label)
    word_size_entry.insert(0, self.word_size.get())
    word_size_entry.bind('<Return>', self._validate_word_value)
    word_size_entry.bind('<FocusOut>', self._validate_word_value)
    word_size_label.pack(side=LEFT, expand=1, pady=5, padx=5, fill=X)
    word_size_entry.pack(side=TOP, expand=1, pady=5, padx=5, fill=X)

    penalty_mismatch_label = ttk.LabelFrame(
        options_frame, text="Penalty Mismatch")
    penalty_mismatch_entry = ttk.Entry(penalty_mismatch_label)
    penalty_mismatch_entry.insert(0, self.penalty_mismatch.get())
    penalty_mismatch_entry.bind(
        '<Return>', self._validate_penalty_mismatch_value)
    penalty_mismatch_entry.bind(
        '<FocusOut>', self._validate_penalty_mismatch_value)
    penalty_mismatch_label.pack(side=LEFT, expand=1, pady=5,
                                padx=5, fill=X)
    penalty_mismatch_entry.pack(side=TOP, expand=1, pady=5,
                                padx=5, fill=X)
    # Min D Nucleotides
    min_d_match_label = ttk.LabelFrame(
        options_frame, text="Minimal Number of D Nucleotides")
    min_d_match_entry = ttk.Entry(min_d_match_label)
    min_d_match_entry.insert(0, self.min_d_match.get())
    min_d_match_entry.bind(
        '<Return>', self._validate_min_match_value)
    min_d_match_entry.bind(
        '<FocusOut>', self._validate_min_match_value)
    min_d_match_label.pack(side=LEFT, expand=1, pady=5, padx=5, fill=X)
    min_d_match_entry.pack(side=TOP, expand=1, pady=5, padx=5, fill=X)

    # how many cpus to use
    proc_count_label = ttk.LabelFrame(
        options_frame, text="Processors")
    proc_count_entry = ttk.Entry(proc_count_label)
    proc_count_entry.insert(0, self.proc_count.get())
    proc_count_entry.bind(
        '<Return>', self._validate_proc_count_value)
    proc_count_entry.bind(
        '<FocusOut>', self._validate_proc_count_value)
    proc_count_label.pack(side=LEFT, expand=1, pady=5, padx=5, fill=X)
    proc_count_entry.pack(side=TOP, expand=1, pady=5, padx=5, fill=X)

많은 이벤트의 바인딩과 설정 옵션와 관련되지 않을 수 있습니다,하지만 나는 아직도 포함합니다.을 것이 최선의 선택이 될하는 스위치 그리드 관리자란?문제 있는 이 프레임 가득 내부에 또 하나의습니다.그렇지 않는 경우에 당신을 사용하기 시작 그리드 관리자,당신은 그것을 사용해야에 대한 모든 것을 할 수 없기 때문에 혼합 포장 및 그리드 관리자에서 동일한 프레임은?

도움이 되었습니까?

해결책

afaik Tkinter에서 동적 인터페이스를 만드는 inbuilt는 없습니다.가장 좋은 방법은 화면 해상도를 가져 와서 그리드 / 팩을 적절하게 가져 오는 것입니다.

user32 = ctypes.windll.user32
get_screensize = (user32.GetSystemMetrics(0), user32.GetSystemMetrics(1))
.

그래서 예를 들어 ....

widget1 = tkinter.Entry(root,width=20,etc)
widget2 = tkinter.Label(root,text='Hello',etc)
## Now perform update_idletasks() which will force
## Tkinter to calculate their size.
widget1.update_idletasks()
widget2.update_idletasks()
## Now calculate whether they'll fit.
if widget1.winfo_width() + widget2.winfo_width() > screensize[0]:## Not enough space
    widget1.grid(row=0)
    widget2.grid(row=1)
else:## Both will fit on one line.
    widget1.grid(row=0,column=0)
    widget2.grid(row=0,column=1)
.

다른 팁

일반적으로,동의함으로 I_do_python 의 대답은,그러나 나는 하나의 작은 수정할 수 있습니다.나는 모든 위젯 새로운 프레임과 프레임을 사용의 폭으로 리트머스 시험지 여부를 랩이 포함되어 있습니다.고 바인딩할 수 있습니다 이벤트에 대한 처리기 "<Configure>" 이벤트는지 확인합하는 경우 프레임의 내용을 포장해야 할 때 응용 프로그램의 창(그리고 프레임)의 크기가 조정됩니다.

을 만들었다고 아래 기능을 사용하는 그리드 방법을 지능적으로 삽입을 위젯으로 프레임입니다.그것은 확실히 향상 시킬 수 있습니다,하지만 그것이 나를 위해 작동 합니다.일반적으로 사용하는 경우 .grid() 을 채우 부모로,당신이 얻을 수 있는 낭비할 때 공백을 채우는 위젯에 따라 다릅니다.아래 기능을 이해 깨고 부모를 논리적으로 열(divisions 코드)수 있는 위젯을 여러 개의 열이 있습니다.그 결과 그리드 레이아웃으로 많이 감소 낭비 공백이 있을 수 있습니다.높은 설정 divisions, 그 결과,더 나은,그러나 기본값은 대부분의 상황입니다.

def smart_grid(parent, *args, **kwargs): # *args are the widgets!
    divisions   = kwargs.pop('divisions', 100)
    force_f     = kwargs.pop('force', False)
    if 'sticky' not in kwargs:
        kwargs.update(sticky='w')
    try:
        parent.win_width
    except:
        parent.win_width = -1
    winfo_width = parent.winfo_width()
    if 1 < winfo_width != parent.win_width or force_f:
        parent.win_width = winfo_width
        row = col = width = 0
        argc = len(args)
        for i in range(argc):
            widget_width = args[i].winfo_width()
            columns = max(1, int(widget_width * float(divisions) / winfo_width))
            width += widget_width
            if width > winfo_width:
                width = widget_width
                row += 1
                col = 0
            args[i].grid(row=row, column=col, columnspan=columns, **kwargs)
            col += columns
        parent.update_idletasks() # update() # 
        return row + 1

결국 나는 몇 분을 다시 작성과 w.winfo_reqwidth() 을 것입 업데이트 내 게시합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top