Справка по макету Python 3.1 Tkinter.Я близко, пожалуйста, помогите мне закончить это - PullRequest
0 голосов
/ 07 февраля 2010

Кстати, я использую 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()

1 Ответ

2 голосов
/ 12 февраля 2010

Вам определенно нужен менеджер сетки - Pack работает только для вертикального или горизонтального накопления. Вы можете использовать несколько фреймов, чтобы обойти это, но я считаю, что проще расширить графический интерфейс, если вы просто сделаете это с помощью Grid для запуска.

Вот что я очень быстро разработал, основываясь на том, что вы сказали, и на коде. Я уменьшил / удалил заполнение - это выглядело для меня огромно - и я установил две полосы прокрутки в подкадре, чтобы сделать заполнение более простым. Обратите внимание, что для того, чтобы сделать горизонтальную полосу прокрутки полезной, ваша область текста должна иметь wrap = NONE; в противном случае вы можете использовать простой виджет «ScrolledText» из tkinter.scrolledtext и пропустить горизонтальную полосу прокрутки.

Я теперь немного перефразировал вещи, чтобы учесть изменение размера, с минимальным размером, который показывает верхние кнопки - см. Использование minsize и row / columnconfigure.

Кстати, похоже, ваши переменные никуда не выводятся - это намеренно?

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, ставший "стандартным", является хорошей функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...