Помощь по макету Python 3.1 Tkinter.Я близко, пожалуйста, помоги мне закончить это
-
19-09-2019 - |
Вопрос
Кстати, я использую Python 3.1.
Я пытаюсь создать простой графический интерфейс, используя Tkinter - метку, поле ввода текста, кнопку в первой строке и редактируемую текстовую область с полосой прокрутки справа и внизу - во второй строке.Помогите, пожалуйста, исправить макет.То, что у меня ниже, не совсем работает.Если мне придется использовать сетку, я это сделаю.Я хочу, чтобы код был очень простым — я хочу «продать» Python некоторым моим коллегам.Итак, я хочу получить приличный внешний вид.Если вы не возражаете, предложите лучшее дополнение.Кроме того, если мои имена переменных и т. д.кажется странным, тогда, пожалуйста, запишите.
В то же время я хочу сделать вид, что это одноразовый сценарий, на который я не потратил много времени.Раз уж я прошу вашей помощи, то это не так, но им это знать не обязательно ;).Поэтому я не хочу вводить причудливый код для создания красивых границ и т. д.Мне просто нужно что-то визуально привлекательное, чистое и простое.Если я этого не сделаю, то моя презентация не достигнет своей цели.
Спасибо, мой код ниже:
class App:
def __init__(self, parent):
frame = Frame(parent)
self.__setup_gui(frame) # Call Helper
frame.pack(padx=15, pady=15)
parent.title('To be changed')
def __setup_gui(self, frame):
# First Row
self.cs_label = Label(frame, text='Change Set: ')
self.cs_label.pack(side=LEFT, padx=10, pady=10)
self.cs_val = Entry(frame, width=10)
self.cs_val.pack(side=LEFT, padx=10, pady=10)
self.get_button = Button(frame, text='Get', command=self.get_content)
self.get_button.pack(side=LEFT, padx=10, pady=10)
# Text area and scrollbar
self.text_area = Text(frame, height=10, width=50, background='white')
# Put a scroll bar in the frame
scroll = Scrollbar(frame)
self.text_area.configure(yscrollcommand=scroll.set)
self.text_area.pack(side=TOP)
scroll.pack(side=RIGHT,fill=Y)
self.clipboard_var = IntVar()
self.notepad_var = IntVar()
def get_content(self):
print(self.clipboard_var.get())
print(self.notepad_var.get())
###################################################################################################
if __name__ == '__main__':
root = Tk()
app = App(root)
root.mainloop()
Решение
Вам определенно нужен менеджер сетки — пакет сам по себе работает только для вертикального или горизонтального стека.Чтобы обойти эту проблему, вы можете использовать несколько фреймов, но я считаю, что проще расширить графический интерфейс, если для начала вы просто сделаете это с помощью Grid.
Вот что я очень быстро придумал, основываясь на том, что вы сказали, и на коде.Я уменьшил/убрал отступы — мне они показались огромными — и установил две полосы прокрутки в подкадре, чтобы облегчить работу с отступами.Обратите внимание, что для того, чтобы горизонтальная полоса прокрутки была полезной, ваша текстовая область должна иметь тип Wrap=NONE;в противном случае вы также можете использовать простой виджет «ScrolledText» из tkinter.scrolledtext и пропустить горизонтальную полосу прокрутки.
Теперь я немного переформулировал ситуацию, чтобы можно было изменять размер, установив минимальный размер, при котором отображаются верхние кнопки — см. использование минимального размера и настройки строки/столбца.
Кстати, похоже, что ваши переменные ниоткуда не извлекаются - это намеренно?
from tkinter import *
class App:
def __init__(self, parent):
self.__setup_gui(parent) # Call Helper
parent.title('To be changed')
def __setup_gui(self, parent):
# First Row
self.rowframe = Frame(parent)
self.rowframe.grid()
self.cs_label = Label(self.rowframe, text='Change Set: ')
self.cs_label.grid(row=0, column=0, padx=2, pady=2)
self.cs_val = Entry(self.rowframe, width=10)
self.cs_val.grid(row=0, column=1, padx=2, pady=2)
self.get_button = Button(self.rowframe, text='Get', command=self.get_content)
self.get_button.grid(row=0, column=2, padx=2, pady=2)
parent.update_idletasks()
parent.minsize(width=self.rowframe.winfo_width(), height=self.rowframe.winfo_height())
# Text area and scrollbars
self.textframe = Frame(parent)
self.textframe.grid(row=1, columnspan=2, padx=2, pady=2, sticky=N+S+E+W)
self.hscroll = Scrollbar(self.textframe, orient=HORIZONTAL)
self.vscroll = Scrollbar(self.textframe)
self.text_area = Text(self.textframe, height=10, width=50, wrap=NONE, background='white', yscrollcommand=self.vscroll.set, xscrollcommand=self.hscroll.set)
self.text_area.grid(row=0, column=0, sticky=N+S+E+W)
self.hscroll.config(command=self.text_area.xview)
self.hscroll.grid(row=1, column=0, sticky=E+W)
self.vscroll.config(command=self.text_area.yview)
self.vscroll.grid(row=0, column=1, sticky=N+S)
# Row 0 defaults to 0
parent.rowconfigure(1, weight=1)
parent.columnconfigure(1, weight=1)
# Textarea setup
self.textframe.rowconfigure(0, weight=1)
self.textframe.columnconfigure(0, weight=1)
self.clipboard_var = IntVar()
self.notepad_var = IntVar()
def get_content(self):
print(self.clipboard_var.get())
print(self.notepad_var.get())
###################################################################################################
if __name__ == '__main__':
root = Tk()
app = App(root)
root.mainloop()
Теперь, все сказанное... вы можете получить больше визуальной привлекательности с PyGTK, PyQt или wxPython, хотя tkinter, ставший «стандартным», является хорошей функцией.