Как указать расположение нескольких кнопок в tkinter

#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 , добавление фрейма для меня более понятно.