2016-10-13 2 views
0

Я пытаюсь создать простой интерфейс в Python (2.7) с Tkinter с указанием окна ввода пользователя, кнопки обзора и описания в первой строке и многострочного объяснения охватывая их ширину на линии ниже.Tkinter - columnspan, похоже, не влияет на сообщение

Моя проблема заключается в том, что вариант columnspan не кажется, чтобы мой Message виджет, чтобы охватить ширину трех столбцов выше, как можно увидеть ниже:

Non-spanning message box

Как я могу получить это Message для охвата всей ширины? Я дополнительно пробовал использовать параметр width, но это похоже на другой масштаб, чем для виджета Entry.

Мой код выглядит следующим образом:

from Tkinter import * 

class App(Frame): 

    def __init__(self, *args, **kwargs): 
     Frame.__init__(self, *args, **kwargs) 
     self.grid(sticky=N + W + E + S) 

     # set up labels and buttons 
     self.folder_text = Label(
      self, text='Select Folder: ', font='Arial 10', anchor=W 
     ) 
     self.folder_text.grid(row=0, column=0, sticky=W) 

     self.input_folder = Entry(
      self, width=40, font='Arial 10' 
     ) 
     self.input_folder.grid(row=0, column=1) 

     self.browse_button = Button(
      self, text="Browse", font='Arial 8 bold', 
      command=lambda: self.browse_for_folder(self.input_folder) 
     ) 
     self.browse_button.grid(row=0, column=2) 

     self.desc = Message(
      self, text='This tool will create a .csv file in the specified folder containing the Time and ' 
         'Latitude/Longitude (WGS84) for all TIFF, RAW and JPEG/JPG files contained in the ' 
         'folder with this information available.', font='Arial 8', anchor=W 
     ) 
     self.desc.grid(row=1, column=0, columnspan=3, sticky=E + W) 

     self.run_button = Button(
      self, text="Run!", font='Arial 10 bold', fg='red', 
      command=lambda: self.run(self.input_folder) 
     ) 

     self.run_button.grid(row=2, column=1) 

# ---SNIP--- 

root = Tk() 
root.bind('<Escape>', lambda e: root.destroy()) 
root.resizable(0, 0) 
root.title('Get photo geolocations') 

app = App(root) 
root.mainloop() 
+0

@MichelTouw это [встроенный тип виджета] (http://effbot.org/tkinterbook/message.htm) – asongtoruin

ответ

1

Если вы измените цвет фона виджета, вы увидите, что он действительно охватывает несколько столбцов.

Основная особенность виджета Message заключается в том, что он будет вставлять строки в текст, чтобы текст сохранял определенное соотношение сторон, если ширина не указана. Текст окна Message не заполняет дополнительное горизонтальное пространство, если виджет становится шире его естественного размера.

Соотношение сторон игнорируется, если вы укажете ширину. В отличие от Label, где ширина относится к числу символов, опция width для Message основана на пикселях (или на расстоянии: дюймы, сантиметры, миллиметры или точки принтера).

Простой способ использовать опцию width является привязка к <Configure> случае виджета и установить параметр ширины, чтобы быть фактическая ширина виджета (или ширина минус немного на краю)

Например:

self.desc.bind("<Configure>", 
    lambda event: event.widget.configure(width=event.width-8)) 
+0

Это работает точно так же, как мне это нужно, чтобы, спасибо очень много. – asongtoruin

1

Message использует соотношение сторон или ширину символа, чтобы определить его размер.

Вы можете дать ему ширину, а затем он будет работать:

self.desc = Message(
     self, text='This tool will create a .csv file in the specified folder containing the Time and ' 
        'Latitude/Longitude (WGS84) for all TIFF, RAW and JPEG/JPG files contained in the ' 
        'folder with this information available.', font='Arial 8', anchor=W, width = 400 
    ) 

enter image description here

В качестве альтернативы, вы можете сделать окно, зачитывает его ширину с root.geometry(), установите ширину виджета, затем установите в него текст.

Смежные вопросы