Test pygubu app with 3 sections and menu
<?xml version='1.0' encoding='utf-8'?>
<interface>
<object class="ttk.Frame" id="maincontent">
<property name="height">200</property>
<property name="width">200</property>
<layout>
<property name="column">0</property>
<property name="propagate">True</property>
<property name="row">0</property>
</layout>
<child>
<object class="ttk.Label" id="Label_1">
<property name="text" translatable="yes">Label_1</property>
<layout>
<property name="column">0</property>
<property name="pady">5</property>
<property name="propagate">True</property>
<property name="row">0</property>
<property name="sticky">nw</property>
</layout>
</object>
</child>
<child>
<object class="ttk.Entry" id="Entry_1">
<property name="text" translatable="yes">Entry_1</property>
<layout>
<property name="column">0</property>
<property name="ipady">5</property>
<property name="propagate">True</property>
<property name="row">1</property>
</layout>
</object>
</child>
<child>
<object class="ttk.Label" id="Label_2">
<property name="text" translatable="yes">Label_2</property>
<layout>
<property name="column">1</property>
<property name="pady">5</property>
<property name="propagate">True</property>
<property name="row">0</property>
<property name="sticky">nw</property>
</layout>
</object>
</child>
<child>
<object class="ttk.Entry" id="Entry_2">
<property name="text" translatable="yes">Entry_2</property>
<layout>
<property name="column">1</property>
<property name="ipady">5</property>
<property name="propagate">True</property>
<property name="row">1</property>
</layout>
</object>
</child>
<child>
<object class="ttk.Label" id="Label_3">
<property name="text" translatable="yes">Label_3</property>
<layout>
<property name="column">0</property>
<property name="pady">5</property>
<property name="propagate">True</property>
<property name="row">2</property>
<property name="sticky">nw</property>
</layout>
</object>
</child>
<child>
<object class="ttk.Entry" id="Entry_3">
<property name="text" translatable="yes">Entry_3</property>
<layout>
<property name="column">0</property>
<property name="ipady">5</property>
<property name="propagate">True</property>
<property name="row">3</property>
</layout>
</object>
</child>
<child>
<object class="ttk.Label" id="Label_4">
<property name="text" translatable="yes">Label_4</property>
<layout>
<property name="column">1</property>
<property name="pady">5</property>
<property name="propagate">True</property>
<property name="row">2</property>
<property name="sticky">nw</property>
</layout>
</object>
</child>
<child>
<object class="ttk.Entry" id="Entry_4">
<property name="text" translatable="yes">Entry_4</property>
<layout>
<property name="column">1</property>
<property name="ipady">5</property>
<property name="propagate">True</property>
<property name="row">3</property>
</layout>
</object>
</child>
<child>
<object class="ttk.Button" id="Button_2">
<property name="command">on_btn_save</property>
<property name="text" translatable="yes">Save</property>
<layout>
<property name="column">0</property>
<property name="ipadx">5</property>
<property name="ipady">5</property>
<property name="padx">5</property>
<property name="pady">5</property>
<property name="propagate">True</property>
<property name="row">8</property>
<property name="sticky">nw</property>
</layout>
</object>
</child>
<child>
<object class="ttk.Button" id="Button_3">
<property name="command">on_btn_back</property>
<property name="text" translatable="yes">Cancel</property>
<layout>
<property name="column">0</property>
<property name="columnspan">15</property>
<property name="ipadx">5</property>
<property name="ipady">5</property>
<property name="padx">2</property>
<property name="pady">5</property>
<property name="propagate">True</property>
<property name="row">8</property>
<property name="sticky">n</property>
</layout>
</object>
</child>
</object>
</interface>
import os
import tkinter as tk
from tkinter import messagebox
import pygubu
root = tk.Tk()
class Application(pygubu.TkApplication):
def _create_ui(self):
#1: Create a builder
self.builder = builder = pygubu.Builder()
#2: Load an ui file
builder.add_from_file(self.ui_file("menu.ui"))
#3: Create the widget using self.master as parent
self.mainwindow = builder.get_object('mainwindow',self.master)
# Set main menu
self.mainmenu = menu = builder.get_object('mainmenu', self.master)
self.set_menu(menu)
self.maincontent = builder.get_object('maincontent',self.master)
self.maincontent.pack()
# Configure callbacks
builder.connect_callbacks(self)
def ui_file(self,ui):
return os.path.join(os.path.dirname(__file__),ui)
def on_mfile_item_clicked(self, itemid):
if itemid == 'mfile_open':
messagebox.showinfo('File', 'You clicked Open menuitem')
if itemid == 'mfile_quit':
messagebox.showinfo('File', 'You clicked Quit menuitem. Byby')
self.quit();
def on_about_clicked(self):
messagebox.showinfo('About', 'You clicked About menuitem')
def on_btn_clicked(self):
self.maincontent.pack_forget()
self.builder = builder = pygubu.Builder()
builder.add_from_file(self.ui_file("another.ui"))
self.about = builder.get_object('maincontent',self.mainwindow)
self.about.pack()
builder.connect_callbacks(self)
def on_btn_save(self):
self.about.pack_forget()
self.builder = builder = pygubu.Builder()
builder.add_from_file(self.ui_file("settings.ui"))
self.about = builder.get_object('maincontent',self.mainwindow)
self.about.pack()
# Configure callbacks
builder.connect_callbacks(self)
def on_btn_back(self):
self.about.pack_forget()
self.builder = builder = pygubu.Builder()
builder.add_from_file(self.ui_file("menu.ui"))
self.maincontent = builder.get_object('maincontent',self.mainwindow)
self.maincontent.pack()
# Configure callbacks
builder.connect_callbacks(self)
def run(self):
self.mainwindow.mainloop()
if __name__ == '__main__':
app = Application(root)
app.run()
<?xml version='1.0' encoding='utf-8'?>
<interface>
<object class="tk.Menu" id="mainmenu">
<property name="tearoff">0</property>
<child>
<object class="tk.Menuitem.Submenu" id="mfile">
<property name="label" translatable="yes">File</property>
<property name="tearoff">0</property>
<child>
<object class="tk.Menuitem.Command" id="mfile_open">
<property name="command">on_mfile_item_clicked</property>
<property name="command_id_arg">True</property>
<property name="label" translatable="yes">Open</property>
</object>
</child>
<child>
<object class="tk.Menuitem.Separator" id="separator1" />
</child>
<child>
<object class="tk.Menuitem.Command" id="mfile_quit">
<property name="command">on_mfile_item_clicked</property>
<property name="command_id_arg">True</property>
<property name="label" translatable="yes">Quit</property>
</object>
</child>
</object>
</child>
<child>
<object class="tk.Menuitem.Submenu" id="mhelp">
<property name="label" translatable="yes">Help</property>
<property name="tearoff">0</property>
<child>
<object class="tk.Menuitem.Command" id="mhelp_about">
<property name="command">on_about_clicked</property>
<property name="command_id_arg">False</property>
<property name="label" translatable="yes">About</property>
</object>
</child>
</object>
</child>
</object>
<object class="ttk.Frame" id="mainwindow">
<property name="height">300</property>
<property name="width">400</property>
<layout>
<property name="column">0</property>
<property name="propagate">True</property>
<property name="row">0</property>
<property name="sticky">nesw</property>
</layout>
<child>
<object class="ttk.Frame" id="maincontent">
<property name="height">300</property>
<property name="width">400</property>
<layout>
<property name="column">0</property>
<property name="propagate">True</property>
<property name="row">0</property>
</layout>
<child>
<object class="ttk.Label" id="lb_1">
<property name="font">{Consolas} 12 {bold}</property>
<property name="justify">center</property>
<property name="text" translatable="yes">Welcome to page one</property>
<layout>
<property name="column">0</property>
<property name="ipadx">5</property>
<property name="ipady">5</property>
<property name="padx">5</property>
<property name="pady">5</property>
<property name="propagate">False</property>
<property name="row">0</property>
<property name="sticky">nw</property>
</layout>
</object>
</child>
<child>
<object class="ttk.Button" id="btn_1">
<property name="command">on_btn_clicked</property>
<property name="cursor">arrow</property>
<property name="default">normal</property>
<property name="text" translatable="yes">Page 2</property>
<layout>
<property name="column">0</property>
<property name="ipadx">5</property>
<property name="ipady">5</property>
<property name="padx">5</property>
<property name="pady">5</property>
<property name="propagate">False</property>
<property name="row">1</property>
</layout>
</object>
</child>
</object>
</child>
</object>
</interface>
<?xml version='1.0' encoding='utf-8'?>
<interface>
<object class="ttk.Frame" id="maincontent">
<property name="height">200</property>
<property name="width">200</property>
<layout>
<property name="column">0</property>
<property name="propagate">True</property>
<property name="row">0</property>
</layout>
<child>
<object class="tk.Text" id="txt_1">
<property name="height">10</property>
<property name="text" translatable="yes">this is a new section</property>
<property name="width">50</property>
<layout>
<property name="column">0</property>
<property name="propagate">True</property>
<property name="row">0</property>
</layout>
</object>
</child>
<child>
<object class="ttk.Button" id="btn_2">
<property name="command">on_btn_back</property>
<property name="text" translatable="yes">Back to home</property>
<layout>
<property name="column">0</property>
<property name="ipadx">5</property>
<property name="ipady">5</property>
<property name="padx">5</property>
<property name="pady">5</property>
<property name="propagate">True</property>
<property name="row">1</property>
<property name="sticky">nw</property>
</layout>
</object>
</child>
</object>
</interface>