#python #user-interface #tkinter
Вопрос:
Я-ткинтерн нуб. Я переписываю свою собственную программу, используя примеры других людей. Но что меня смущает, так это то, что я не знаю, как разместить кнопки там, где я хочу. Может кто-нибудь посоветовать, пожалуйста? Или откуда я могу обратиться? Большое спасибо.
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import tkinter as tk
from tkinter import ttk
LARGE_FONT= ("Verdana", 12)
class Application(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.wm_title(self, "Test Windows")
tk.Tk.geometry(self, '1000x600')
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Start Page", font=LARGE_FONT)
label.pack(pady=10,padx=10)
Graph_btn = ttk.Button(self, text="Graph Page",
command=lambda: controller.show_frame(PageTwo))
Graph_btn.pack()
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Graph Page!", font=LARGE_FONT)
label.pack(pady=10,padx=10)
BtH_btn = ttk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
BtH_btn.pack(side='left')
BtH_btn2 = ttk.Button(self, text="Back to Home2")
BtH_btn2.pack(side='left')
f = Figure(figsize=(10,3), dpi=100)
a = f.add_subplot(111)
a.plot([1,2,3,4,5,6,7,8],[5,6,1,3,8,9,3,5])
canvas = FigureCanvasTkAgg(f, self)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
app = Application()
app.mainloop()
Я хочу, чтобы кнопка находилась горизонтально под кнопкой label
.
Комментарии:
1. Поместите 2 кнопки в рамку. Затем вы можете использовать
<your frame>.pack()
, а затемcanvas.get_tk_widget().pack(fill="both", expand=True)
2. Я не понимаю, BtH_btn.pack(сторона= «сверху») вместо BtH_btn.pack(сторона= «слева») (то же самое для BtH_btn2.pack(сторона= «слева») ) не работает ? Вы абсолютно хотите, чтобы это было внутри сюжетной канвы ?
3. @TheLizzard, спасибо за ваш ответ, как вы и сказали, мне нужно добавить кадры. Я был слишком одержим установкой
init
» оApplication
» раньше, но после установки все работаетPageTwo
.
Ответ №1:
У вас есть 3 разных маршрута, вы можете использовать :
- widget.pack() : он полезен для небольших вещей, но я не часто им пользуюсь, я предпочитаю:
- widget.grid(столбец = x, строка = y) : в конечном итоге вы даже можете определить диапазон строк и столбцов. Никакого перекрытия.
- виджет.место(x, y) : Он помещает ваш виджет в точное заданное положение. Просто помните, что это будет зависеть от размера вашего окна, будет ли оно размещено правильно или нет, и от размера самого виджета (может перекрываться).
В вашем примере я буду использовать метод сетки.
Эта ссылка дает более глубокое объяснение и хороший пример.
Комментарии:
1. Если вместо этого будет использоваться OP
.grid
.pack
, вам нужно будет разместить ссылку на объяснение того, как развернуть холст, чтобы заполнить окно.2. @Apo, спасибо за ваш большой вклад, с которым я еще не знаком
grid
, добавление фрейма для меня более понятно.