【问题标题】:Tkinter text widget deforms column sizeTkinter 文本小部件使​​列大小变形
【发布时间】:2019-09-21 10:04:05
【问题描述】:

我无法像图片中那样将小部件打包成行或列,你能帮帮我吗?

问题是文本小部件变形列大小,文本不应该在 row=3,column=0 中?

   def _formato(self):
    t1=tkinter.Toplevel(self._finestra)
    labelTop = tkinter.Label(t1,text = "Tipo di carattere")
    labelTop.grid(row=0, column=0)
    labelTop2 = tkinter.Label(t1,text = "Dimensione")
    labelTop2.grid(row=0, column=1)
    labelTop3 = tkinter.Label(t1)
    labelTop3.grid(row=2, column=0)
    listaFont=tkinter.ttk.Combobox(t1)
    allfonts = sorted(tkinter.font.families())
    listaFont["values"] =  allfonts
    listaFont.grid(row=1, column=0)
    listaFont.bind("<<ComboboxSelected>>", None)
    listaDimensione = tkinter.ttk.Combobox(t1)
    allfontsizes = list(range(8,70))
    listaDimensione['values'] =  allfontsizes
    listaDimensione.grid(row=1, column=1)
    testo= tkinter.Text(t1)
    testo.insert(tkinter.INSERT,'AaBbYyZz')
    testo.grid(row=3,column=0)

【问题讨论】:

  • 您能否添加更多详细信息,您想要实现什么,什么有效,什么无效?
  • @Jere:OP 想以grid 方式布局小部件,但使用pack 没有选项。
  • @stovfl 我昨天还不清楚。问题是文本小部件使​​列大小变形。我可以改变它的宽度,但它不准确......
  • @stovfl 是的。目前我通过修改Text的宽度来解决

标签: python python-3.x tkinter widget


【解决方案1】:

问题:同一column 中的所有小部件应具有相同的width

核心是,为每一列使用Frame,并将小部件布局到Frame
这允许所有小部件调整为Frame width


  1. 定义 class App 用于演示目的

    class App(tk.Tk):
        def __init__(self):
            super().__init__()
    
  2. 要获得相等的width,请为每一列使用tk.Frame
    允许Frame 发展他的width
    允许Frame 内的小部件增长他的width
    定义Frame 成长为App width

            # column 0
            self.grid_columnconfigure(0, weight=1)
            frame_0 = tk.Frame(self)
            frame_0.grid_columnconfigure(0, weight=1)
            frame_0.grid(row=0, column=0, sticky='nsew')
    
  3. 添加小部件 ...
    定义每个小部件以将他的 width 增加到 Frame width

            labelTop = tkinter.Label(frame_0, text="Tipo di carattere")
            labelTop.grid(row=0, column=0, sticky='ew')
    
            listaFont = tkinter.ttk.Combobox(frame_0)
            listaFont.grid(row=1, column=0, sticky='ew')
            allfonts = sorted(tkinter.font.families())
            listaFont["values"] = allfonts
            listaFont.bind("<<ComboboxSelected>>", None)
    
  4. 注意:使用width=1重置默认值

            testo = tkinter.Text(frame_0, width=1)
            testo.insert(tkinter.INSERT, 'AaBbYyZz')
            testo.grid(row=3, column=0, sticky='ew')
    
  5. 第 1 列也一样 ...

            # column 1
            self.grid_columnconfigure(1, weight=1)
            frame_1 = tk.Frame(self)
            frame_1.grid_columnconfigure(0, weight=1)
            frame_1.grid(row=0, column=1, sticky='nsew')
    
            labelTop2 = tkinter.Label(frame_1, text="Dimensione")
            labelTop2.grid(row=0, column=0, sticky='ew')
    
            listaDimensione = tkinter.ttk.Combobox(frame_1)
            allfontsizes = list(range(8, 70))
            listaDimensione['values'] = allfontsizes
            listaDimensione.grid(row=1, column=0, sticky='ew')
    

用法

    if __name__ == "__main__":
        App().mainloop()

用 Python 测试:3.5

【讨论】:

  • 唯一的问题,为什么在 Text 上使用 width=1? testo = tkinter.Text(frame_0, width=1)
  • @antonio: Text 小部件对width/height 很贪心,它用一个休width 进行实例化。强制width 服从Frame width 是一种解决方法。
  • @antonio " 将框架放置在顶层?":同样,更改为class App(tk.Toplevel): 并在__main__ 中首先执行root = tk.Tk()。默认使用root
  • 只是一个问题,我将 Text 小部件的高度设置为 3,当我增加字体大小时,它的高度会增加...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多