Ткинтер: некоторые вопросы по ноутбуку - PullRequest
1 голос
/ 12 марта 2020

Я работаю над ноутбуком и выполнил следующий код:

from tkinter import *
from tkinter import ttk
import tkinter as tk

class Notebook:

    def __init__(self,title):
        self.root = Tk()
        self.root.title(title)
        self.notebook = ttk.Notebook(self.root)
        self.add_tab()
        self.run()

    def add_tab(self):
        #Add initial tabs
        frame_notebook_1 = ttk.Frame(self.notebook)
        frame_notebook_2 = ttk.Frame(self.notebook)
        frame_notebook_new=ttk.Frame(self.notebook)

        self.notebook .add(frame_notebook_1, text = '--1--')
        self.notebook .add(frame_notebook_2, text = '--2--')
        self.notebook .add(frame_notebook_new, text = '  +  ')

        self.notebook.pack(expand=True, fill='both')

        #Configurate "  +  " tab
        self.new_tab_save_value = tk.StringVar(frame_notebook_new)
        self.new_tab_entry = tk.Entry(frame_notebook_new, textvariable=self.new_tab_save_value,font=('Verdana',10))
        self.new_tab_entry.grid(row=2, column=3,sticky="EW")
        self.new_tab_entry.config(width=17)

        self.button_new = tk.Button(frame_notebook_new, text="Create", command=self.new_tab_return)
        self.button_new.grid(row=3, column=3,sticky="NSEW")
        self.button_new.config(width=17)



    def new_tab_return(self):
        #method to generate a new tab
        frame = ttk.Frame(self.notebook)
        self.notebook.add(frame,text="--"+str(len([self.notebook.tab(i, option="text") for i in self.notebook.tabs()]))+"--")
        label = ttk.Label(frame,text=self.new_tab_save_value.get())
        label.grid(column=1,row=1)
        self.notebook.select(len([self.notebook.tab(i, option="text") for i in self.notebook.tabs()])-1)

    def run(self):
        self.root.mainloop()

nb = Notebook('Test')

У меня есть несколько вопросов по этому поводу.

ПЕРВЫЙ ВОПРОС: можно ли изменить порядок вкладок в тетрадь? В самом деле, я бы хотел, чтобы вкладка «+» всегда была в последней позиции.

ВТОРОЙ ВОПРОС: Когда программа генерирует новую вкладку, ее имя кадра просто «frame». Можно ли автоматически изменить имя переменной, например, на frame_ "tabnumber"? На самом деле, я бы хотел поработать над этими кадрами позже, так что будет нелегко, если у них у всех одинаковое имя:)

Заранее спасибо и извините за большую грязную программу ^^

1 Ответ

1 голос
/ 12 марта 2020

Как я уже упоминал в моем комментарии, вы, вероятно, должны использовать insert. Кроме того, если вы хотите сохранить несколько переменных с одним и тем же именем, это звучит как хорошее время для использования массива. Вот пример того, как этого можно достичь.

from tkinter import ttk
import tkinter as tk

class Notebook:
    def __init__(self,title):
        self.root = tk.Tk()
        self.root.title(title)
        self.notebook = ttk.Notebook(self.root)
        self.frames = []
        self.add_tab()
        self.run()

    def add_tab(self):
        #Add initial tabs
        self.add_new_tab(initial_entry=True)
        self.add_frame = ttk.Frame(self.notebook)

        self.notebook.add(self.add_frame, text = '  +  ')

        self.notebook.pack(expand=True, fill='both')

        #Configurate "  +  " tab
        self.new_tab_save_value = tk.StringVar(self.add_frame)
        self.new_tab_entry = tk.Entry(self.add_frame, textvariable=self.new_tab_save_value, font=('Verdana',10))
        self.new_tab_entry.grid(row=2, column=3, sticky="EW")
        self.new_tab_entry.config(width=17)

        self.button_new = tk.Button(self.add_frame, text="Create", command=self.add_new_tab)
        self.button_new.grid(row=3, column=3, sticky="NSEW")
        self.button_new.config(width=17)


    def add_new_tab(self, initial_entry=False):
        # since we have an array we know our tab number is always the length
        # of that array
        # so there's no need for list comprehensions to determine the length
        self.frames.append(ttk.Frame(self.notebook))

        if not initial_entry:
            # use insert for our subsequent entries
            self.notebook.insert(len(self.frames) - 1, self.frames[-1], text=f"--{len(self.frames)}--")

            # if you want to modify these labels later, you could also add these
            # to an array.
            label = ttk.Label(self.frames[-1], text=self.new_tab_save_value.get())
            label.grid(column=1, row=1)
        else:
            # use add for our initial entry
            self.notebook.add(self.frames[-1], text=f"--{len(self.frames)}--")

        self.notebook.select(len(self.frames) - 1)


    def run(self):
        self.root.mainloop()

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