2017-11-21 2 views
3

tkinter ttk GUI를 만들고 GUI 크기를 선택하는 라디오 버튼을 만들었습니다. 이것은 전체 응용 프로그램의 전역 글꼴 크기를 변경합니다.글꼴 크기를 변경할 때 입력 위젯의 레이블 위치를 올바르게 업데이트하려면 어떻게합니까?

나는 그것을 보여주기 위해 빠른 스크립트를 만들었습니다.

import tkinter as tk 
    from tkinter import ttk 
    import tkinter.font 

    UI_SIZES = ["Tiny", "Small", "Normal", "Large", "Huge"] 

    TINY_FONT_SIZE = 8 
    SMALL_FONT_SIZE = 12 
    NORMAL_FONT_SIZE = 16 
    LARGE_FONT_SIZE = 18 
    HUGE_FONT_SIZE = 22 

    root = tk.Tk() 

    ui_size = tk.StringVar(root, "Normal") 
    entry_text = tk.StringVar(root, "Entry Text") 


    def text_size_callback(*_args): 
     """change the program font size when the font_size variable changes""" 
     font = tkinter.font.nametofont("TkDefaultFont") 
     selected_size = ui_size.get() 
     if selected_size == "Tiny": 
      font.configure(size=TINY_FONT_SIZE) 
     elif selected_size == "Small": 
      font.configure(size=SMALL_FONT_SIZE) 
     elif selected_size == "Normal": 
      font.configure(size=NORMAL_FONT_SIZE) 
     elif selected_size == "Large": 
      font.configure(size=LARGE_FONT_SIZE) 
     elif selected_size == "Huge": 
      font.configure(size=HUGE_FONT_SIZE) 
     root.option_add("*Font", font) 


    ui_size.trace('w', text_size_callback) 
    ui_size.set("Normal") 

    ui_radio_group = ttk.Frame(root) 
    ui_size_radios = [] 
    for sizeval in UI_SIZES: 
     ui_size_radios.append(ttk.Radiobutton(
      ui_radio_group, 
      text=sizeval, 
      variable=ui_size, 
      value=sizeval 
     )) 
    text_entry = ttk.Entry(ui_radio_group, textvariable=entry_text) 

    i = 0 
    for sizeradio in ui_size_radios: 
     sizeradio.grid(row=i, column=0, sticky=tk.W) 
     i += 1 
    text_entry.grid(row=2, column=1) 
    ui_radio_group.pack() 

    root.mainloop() 

항목 (및 콤보 상자) 안의 레이블을 제외하면 잘 작동합니다. 텍스트 자체가 크기는 조정되지만 텍스트는 편집 될 때까지 레이블에 표시되지 않습니다. 이렇게하면 텍스트 항목이 이상하게 보입니다. 여기

그것은 시작에

normal text setting, nothing weird

내가 백 스페이스

sizing is fixed after editing text

공격 후 다음 작은

text is tiny, but sizing is off

그런 다음 고정을 클릭 한 후 엉망

어떻게이 문제를 해결할 수 있습니까? 또는이 작업을보다 정확하게 수행하면 어떻게 해결할 수 있습니까? 도움이된다면 Python 3.6.3 64 비트를 사용하여 Windows 10을 사용 중입니다.

편집은 : 당신이 모두 몇 가지 테스트 후

+0

'grid()'또는'pack()'을 사용합니까? – furas

+0

맨 위는'pack()'을 사용하고 맨 아래는'grid()'를 사용합니다 – DTreth

+0

항목 안의 레이블로 무엇을 의미합니까, 텍스트를 의미하지 않습니까? – Nae

답변

1

로 찌를을 위해 내가 예를했다, 단지 ttk.Entry하지 tk.Entry 일어날 것으로 보인다. 적어도 해결 방법에는 두 가지가 있습니다

  1. 다음 삽입 글꼴 크기가 항목의 글꼴을 다시 구성
  2. 을 변경 한 후 항목에 텍스트를 삭제 글꼴 크기 여기

이입니다 변경 후 예 :

import tkinter as tk 
from tkinter import ttk 
import tkinter.font as tkfont 

def change_fontsize(): 
    font.configure(size=30) 

def change_fontsize_1(): 
    font.configure(size=20) 
    # workaround 1 
    entry.insert(0, ' ') 
    entry.delete(0) 

def change_fontsize_2(): 
    font.configure(size=5) 
    # workaround 2 
    entry.configure(font=font) 


root = tk.Tk() 

font = tkfont.Font(root) 
entry = ttk.Entry(root, font=font) 
entry.insert(0, 'Entry Text') 
entry.pack() 

ttk.Button(root, text='Change size, no workaround', command=change_fontsize).pack() 
ttk.Button(root, text='Change size, workaround 1', command=change_fontsize_1).pack() 
ttk.Button(root, text='Change size, workaround 2', command=change_fontsize_2).pack() 

root.mainloop() 
+0

이것은 꽤 훌륭한 대답이지만, "수정"해야하는 모든 항목 위젯에 대해 알기 위해 텍스트 작성자가 필요합니다. 항목 자체에서 잡을 수있는 이벤트가있어서 글꼴 속성을 다시 설정할 수 있습니까? – DTreth

+0

또한, 어딘가에 제출해야하는 ttk 버그입니까? – DTreth

+0

@DTreth 나는 ttk 버그라고 생각하며 파이썬 대신 tcl 스크립트에서 같은 문제가 발생했는지 확인했다. 아직보고되지 않았다면 버그 리포트를 작성하는 것이 좋습니다. 첫 번째 주석에 관해서는 수정 된 글꼴 개체이므로 모든 종류의 이벤트를 사용하여 항목을 다시 구성 할 수 있습니다. 필자가 볼 수있는 유일한 해결책은 동일한 글꼴을 공유하는 모든 항목의 목록을 갖고 글꼴 크기가 변경 될 때 반복적으로 모든 항목을 다시 구성하는 것입니다. –

관련 문제