Pergunta

Eu estou usando Python 3.1 pelo caminho.

Eu estou tentando construir uma GUI simples usando Tkinter - label, campo de entrada de texto, botão na primeira linha e área de texto editável com barra de rolagem para a direita e na parte inferior da mesma - na segunda linha. Por favor, me ajudar a arrumar o layout. O que tenho a seguir não funciona muito bem. Se eu tiver que usar uma grade, eu vou. Quero manter o código muito simples - eu quero "vender" Python para alguns dos meus colegas de trabalho. Então, eu quero começar um olhar um pouco decente e sentir. Sugerir melhor estofamento, se você não se importa. Além disso, se meus nomes de variáveis, etc. parecer estranho, em seguida, por favor, faça uma nota.

Ao mesmo tempo eu quero fingir que este é um script de usar e deitar fora que eu não passei muito tempo em. Desde que eu estou pedindo sua ajuda, não é assim, mas eles não precisam saber;). Então, eu não quero introduzir código de fantasia para criar bordas agradáveis, etc. Eu só quero algo que é visualmente atraente, limpo e simples. Se eu não fizer isso, então a minha apresentação não vai atingir o seu objetivo.

Obrigado, meu código está abaixo:

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()
Foi útil?

Solução

Você quer definitivamente o gerente grid - Pacote só funciona para um stackup vertical ou horizontal por si só. Você pode usar vários quadros para trabalhar em torno dele, mas acho que é mais fácil para expandir um GUI se você apenas fazê-lo com Grid para começar.

Aqui está o que eu tenho trabalhado bem rápido com base o que você disse eo código. Eu reduzi / removido o preenchimento - parecia enorme para mim - e eu configurar duas barras de rolagem, em um subframe para fazer o trabalho de preenchimento mais facilmente. Note-se que para fazer a barra de rolagem horizontal útil suas necessidades área de texto para ter envoltório = NONE; caso contrário, você pode muito bem usar o fácil 'ScrolledText' widget da tkinter.scrolledtext e ignorar a barra de rolagem horizontal.

Eu já reformulou as coisas um pouco para permitir redimensionamento, com um tamanho mínimo que mostra os botões de cima -. Ver os usos de minsize e linha / columnconfigure

BTW, parece que suas variáveis ??não estão sendo puxados de qualquer lugar - é que intencional

?
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()

Agora, tudo o que disse ... você pode ter mais apelo visual, com PyGTK, PyQt, ou wxPython, embora tkinter vinda "padrão" é um bom recurso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top