ich habe ein Fenster mit drei Textfeldern. Ein Eingabefeld namens text_field und zwei Ausgabetextfelder mit den Namen evaluation_output und sum_evaluation.
Wie alles angeordnet ist sieht man wohl am Besten direkt am Code.
Wenn ich das Fenster in der Größe änder, soll sich text_field dazu passend in der Höhe und der Breite ändern. evaluation_output ändert nur seine Höhe passen zum texf_field und soll am rechten Rand bleiben. sum_evaluation soll unten rechts bleiben und seine Größe beibehalten.
Ich habe das über ein Event gelöst, aber leider war das ein ziemliches Gefrickel, da die Fenstergröße wohl in Pixel und die Größe der Textfelder in Zeichen angegeben wird. Je nach Fenstergröße passt das jetzt mehr oder weniger gut.
Gibt es eine Methode das ordentlich zu machen?
Hier der Quellcode des Minimalbeispiels:
Code: Alles auswählen
import tkinter as tk
TEXTBOX_WIDTH = 30
EVALUATION_OUTPUT_WIDTH = 5
STANDARD_HEIGHT = 10
class MainWindow:
def __init__(self, master):
self.master = master
self.master.bind("<Configure>", self.adaption_to_frame_size)
self.frame = tk.Frame(self.master)
self.text_field = tk.Text(self.frame, height=STANDARD_HEIGHT, width=TEXTBOX_WIDTH)
self.text_field.grid(row=0, column=0, sticky='nws')
self.evaluation_output = tk.Text(self.frame, height=STANDARD_HEIGHT, width=EVALUATION_OUTPUT_WIDTH)
self.evaluation_output.config(state='disabled')
self.evaluation_output.grid(row=0, column=1, sticky='ne')
self.sum_evaluation = tk.Text(self.frame, height=1, width=EVALUATION_OUTPUT_WIDTH)
self.sum_evaluation.config(state='disabled')
self.sum_evaluation.grid(row=1, column=1, sticky='se')
self.frame.grid()
def adaption_to_frame_size(self, event):
frame_width = int(self.master.winfo_width())
frame_height = int(self.master.winfo_height())
self.text_field.config(width=int(frame_width/8.2)-EVALUATION_OUTPUT_WIDTH, height=frame_height//17)
self.evaluation_output.config(width=EVALUATION_OUTPUT_WIDTH, height=frame_height//17)
def main():
root = tk.Tk()
app = MainWindow(root)
root.mainloop()
if __name__ == '__main__':
main()