Переключение между несколькими окнами в Tkinter - PullRequest
0 голосов
/ 04 мая 2019

Я создал несколько окон, используя Tkinter.Мне нужна помощь в реализации переключения из одного окна в другое при нажатии кнопки.Все создаваемые окна должны иметь одинаковый размер.А также я хочу очистить существующие данные окна и показать данные следующего окна.

1 Ответ

0 голосов
/ 05 мая 2019

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

Я создал что-то вроде этого, которое может переключаться между окнами и поддерживать ту же геометрию предыдущего окна, как вы сказали.

import tkinter as tk


class Window(tk.Toplevel):
    # List to keep the reference of all the toplevel windows
    _info_pages = []

    def __init__(self, master=None, cnf={}, **kw):
        kw = tk._cnfmerge( (cnf,kw) )
        width = kw.pop('width', master.winfo_width())     # 250x250 will be the standard size of the window
        height = kw.pop('height', master.winfo_height())
        title = kw.pop('title', 'Win %s' %(len(self._info_pages)+1) ) 
        super(Window, self).__init__(master=master, cnf=cnf, **kw)
        for i in self._info_pages: i.wm_withdraw() # Hide the previous windows 
        self._info_pages.append(self)
        self.wm_geometry("%dx%d+%d+%d" % (width, height, 
            master.winfo_rootx()+master.winfo_width(), master.winfo_rooty()))
        self.title(title)
        self.B1 = tk.Button(self, text='◀ Prev', padx=5, command=self.switch_to_prev)
        self.B1.place(relx=0, rely=0.9)

        self.B2 = tk.Button(self, text='Next ▶', padx=5, command=self.switch_to_next)
        self.B2.place(relx=0.76, rely=0.9)

        self.enable_disable_button()

    def enable_disable_button(self):
        """Enable and disable the buttons accordingly if there is no window."""
        for i in self._info_pages:
            if i == self._info_pages[0]: i.B1['state'] = 'disabled'
            else: i.B1['state'] = 'normal'
            if i == self._info_pages[-1]: i.B2['state'] = 'disabled'
            else: i.B2['state'] = 'normal'

    def switch_to_prev(self):
        """Switch to the previous window"""
        index = self._info_pages.index(self)
        if index != 0:
            for i in self._info_pages:
                i.wm_withdraw()
            self._info_pages[index-1].wm_deiconify()
            self._info_pages[index-1].geometry(self.winfo_geometry())

    def switch_to_next(self):
        """Switch to the next window"""
        index = self._info_pages.index(self)
        if index+1 != len(self._info_pages):
            for i in self._info_pages:
                i.wm_withdraw()
            self._info_pages[index+1].wm_deiconify()
            self._info_pages[index+1].geometry(self.winfo_geometry())

    def destroy(self):
        """if a window is destroyed this will open the first window in the list"""
        self._info_pages.remove(self)
        if self._info_pages:
            self._info_pages[0].wm_deiconify()
            self._info_pages[0].geometry(self.winfo_geometry())
            self.enable_disable_button()
        return super().destroy()

# This is just a demo
if __name__ == '__main__':
    import random as rnd

    root = tk.Tk()
    root.geometry('250x250')
    root.title("I'm the main window")
    colorlist = ['beige','bisque','black','blanchedalmond','blue','blueviolet', 
                'burlywood', 'cadetblue','chartreuse','chocolate' ]
    def create_window():
        Window(root, bg=rnd.choice(colorlist))

    tk.Button(root, text='Create Window', command=create_window).pack()

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