Изменить размер виджета Tkinter Text, чтобы он полностью помещался в окне, не обрезаясь внизу - PullRequest
0 голосов
/ 18 марта 2020

Я разрабатываю Tkinter GUI в python. Я пытался создать несколько кадров в окне, чтобы они содержали различные элементы GUI. Я все еще очень плохо знаком с Tkinter, поэтому некоторые аспекты его развития все еще избегают меня. Вполне вероятно, что решение этого очень простое, и я каким-то образом избегал его во всех моих попытках Google, но я нахожусь в своем уме.

Вот мой текущий код.

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.grid()
        self.create_window()
        self.create_widgets()
        self.parent_conn, self.child_conn = Pipe()

    def create_window(self):
        # Define sizes for gui window
        w = 350
        h = 1080

        # Get screen sizes
        ws = root.winfo_screenwidth() + 3
        hs = root.winfo_screenheight() - 70

        # calculate x and y coordinates for the Tk root window
        x = -10
        y = 0

        self.visualFrame = tk.Frame(root, width=938, height=500, relief=tk.RAISED, borderwidth=1)
        self.optionsFrame = tk.Frame(root, relief=tk.RAISED, borderwidth=1)
        self.outputFrame = tk.Frame(root, relief=tk.RAISED, borderwidth=1)
        self.visualFrame.grid(row=0, column=0, sticky="nes", pady=5, padx=5)
        self.optionsFrame.grid(row=0, column=1, sticky="nws", pady=5, padx=5)
        self.outputFrame.grid(row=1, columnspan=2, sticky="ew", padx=5, pady=5)

        # Create Labels for Settings Section
        self.statusLabel = tk.Label(self.optionsFrame, text='Operation Info')
        self.statusLabel.grid(row=0, column=1, sticky="w")
        self.stageLabel = tk.Label(self.optionsFrame, text='  Stage:')
        self.stageLabel.grid(row=1, column=1, sticky="w")
        self.sourceLabel = tk.Label(self.optionsFrame, text='Source Data')
        self.sourceLabel.grid(row=3, column=1, sticky="w")
        self.sourcePoints = tk.Label(self.optionsFrame, text='  Points:')
        self.sourcePoints.grid(row=4, column=1, sticky="w")
        self.targetLabel = tk.Label(self.optionsFrame, text='Target Data')
        self.targetLabel.grid(row=5, column=1, sticky="w")
        self.targetPoints = tk.Label(self.optionsFrame, text='  Points:')
        self.targetPoints.grid(row=6, column=1, sticky="w")
        self.modeLabel = tk.Label(self.optionsFrame, text='Mode')
        self.modeLabel.grid(row=8, column=1, sticky="w")
        self.thresholdLabel = tk.Label(self.optionsFrame, text='Deviation Threshold')
        self.thresholdLabel.grid(row=10, column=1)
        self.thresholdTxt1 = tk.Label(self.optionsFrame, text='Deviation below ')
        self.thresholdTxt1.grid(row=11, column=1)
        self.thresholdTxt2 = tk.Label(self.optionsFrame, text='is permitted')
        self.thresholdTxt2.grid(row=11, column=3)
        self.toleranceLabel = tk.Label(self.optionsFrame, text='Deviation Tolerance')
        self.toleranceLabel.grid(row=12, column=1)
        self.toleranceTxt1 = tk.Label(self.optionsFrame, text='Allow ')
        self.toleranceTxt1.grid(row=13, column=1)
        self.toleranceTxt2 = tk.Label(self.optionsFrame, text='deviated points')
        self.toleranceTxt2.grid(row=13, column=3)

        # Create seperators
        s1 = ttk.Separator(self.optionsFrame, orient='horizontal')
        s1.grid(row=7, columnspan=5, sticky="ew", pady=5)
        s2 = ttk.Separator(self.optionsFrame, orient='horizontal')
        s2.grid(row=14, columnspan=5, sticky="ew", pady=5)

        # Create font
        f = font.Font(self.statusLabel, self.statusLabel.cget("font"))
        f.configure(underline=True)
        self.statusLabel.configure(font=f)
        self.sourceLabel.configure(font=f)
        self.targetLabel.configure(font=f)
        self.modeLabel.configure(font=f)

        # Create window and title
        root.title("Surface Analysis")
        root.geometry('%dx%d+%d+%d' % (ws, hs, x, y))
        root.resizable(0, 0) 

    def create_widgets(self):
        # Create Mode buttons
        quickButton = tk.Button(self.optionsFrame, text="Quick", width=10, command=self.setQuickMode)
        quickButton.grid(row=9, column=1)
        verboseButton = tk.Button(self.optionsFrame, text="Verbose", width=10, command=self.setVerboseMode)
        verboseButton.grid(row=9, column=2)
        trainButton = tk.Button(self.optionsFrame, text="Train", width=10, command=self.train)
        trainButton.grid(row=9, column=3)

        # Create Deviation Entries
        self.devThresh = tk.Entry(self.optionsFrame)
        self.devThresh.grid(row=11, column=2)
        self.devThresh.insert(10, 3.5)
        self.devTol = tk.Entry(self.optionsFrame)
        self.devTol.grid(row=13, column=2)
        self.devTol.insert(10, 10)

        # Create output text box
        self.outputText = tk.Text(self.outputFrame, height=100)
        self.outputText.grid(row=0, columnspan=2)
        # self.outputText.configure(state="disabled")
        # self.vsb = tk.Scrollbar(self, orient="vertical", command=self.outputText.yview)
        # self.outputText.configure(yscrollcommand=self.vsb.set)
        # self.vsb.pack(side="right", fill="y")


if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master=root)
    app.mainloop()

Некоторые части кода были удалены, поскольку они просто порождают другие процессы. Пожалуйста, прости, как ужасно этот код выглядит для некоторых из вас, опытных разработчиков Python / Tkinter. Этот код создает следующее окно ... Текущий GUI Проблема в том, что текстовый виджет внизу. Я хочу, чтобы он занимал всю ширину экрана, с левой стороны, выровненной с отступом, до правой стороны, выровненной с этим заполнением. Что еще более важно, я хочу, чтобы он фактически содержался полностью в реальном окне приложения, чего в настоящее время нет. Он простирается за нижнюю часть экрана, поэтому сделанные записи не видны пользователю.

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

Я должен упомянуть, что попробовал несколько вещей, включая добавление параметра высоты к обоим виджет «Текст» и виджет фрейма, в котором он содержится. Я добавил опцию «липкий» в виджет «Текст», также надеясь, что, если он не будет привязан к «s», он останется на месте. Если для grid_propagate установлено значение false, он не будет отображаться на экране. Тем не менее, текстовый виджет будет разрешать ввод даже после того, как он перестал появляться на экране.

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