Я разрабатываю 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, он не будет отображаться на экране. Тем не менее, текстовый виджет будет разрешать ввод даже после того, как он перестал появляться на экране.