Python 3.1 Tkinter layout de ajuda. Eu estou perto, por favor me ajudar a terminar esta
-
19-09-2019 - |
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()
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.