Класс tkinter для класса 'scroll' не определен - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь вызвать несколько определений, и каждое из них выводит свои результаты в ScrolledText.

Если я определяю ScrolledText в class MainPage, то кнопка OpenFile работает нормально, но Команды меню не с «прокрутки» не определяется ошибка.

Если я определяю ScrolledText в class SampleApp, то меню OpenFile работает нормально, но команды кнопок не с 'scroll' не определена ошибка.

Если я определю оба, тогда я получу два свитка, которые оба работают только в своем собственном классе.

Как передать объект прокрутки между двумя классами использовать один и тот же свиток в обоих классах SampleApp и class MainPage?

#!/usr/bin/env python
# Python3.7.0
# Tkinter

import tkinter as tk                                                    # python 3
#from tkinter import ttk, font  as tkfont, messagebox as mb, filedialog # python 3
from tkinter import ttk
import tkinter.scrolledtext as tkst
from tkinter.ttk import *

# Global scope
FilePath = "C:\Myfiles"
ScrollMsg = ""

# window definitions  ----------------------------------


# Menu definitions  ----------------------------------
def OpenFile(scroll): # Add a filedialog (file & directory chooser)
    global FilePath, ScrollMsg
    FilePath =  "C:\Myfiles\file.txt"
    print("filedialog path & file :\n", FilePath)
    ScrollMsg = "filedialog path & file : " + FilePath
    print ("SCROLL MESSAGE")
    print ( ScrollMsg +"\n")
    scroll.insert(tk.INSERT,ScrollMsg )


# ------------------------------------------------------
class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.replace_frame(MainPage)
        # scrolledtext
        scroll = tkst.ScrolledText(self,width=90,height=15)
        scroll.grid(column=0,row=15, columnspan = 6, sticky='W')
        scroll.insert(tk.INSERT," OK here" +"\n")
        # Menu for all frames  ----------------------------------
        menubar = tk.Menu(self)
        # File
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(label='Open', command=lambda: OpenFile(scroll))
        menubar.add_cascade(label='File', menu=filemenu)
        self.config(menu=menubar)

    def replace_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.grid()



# FRAME CLASSES --------------------------------------
class MainPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)

        lbl1 = tk.Label(self, text="File selection: ")
        lbl1.grid(column=0, row=1)

        lbl2 = tk.Label(self, text="File Path")
        lbl2.grid(column=0, row=2)
        _FP_ = Entry(self,width=30)
        _FP_.insert(0,FilePath) #set the item
        _FP_.grid(column=1, row=2)
        btn = Button(self, text='OpenFile', command=lambda: OpenFile(scroll))
        btn.grid(column=0, row=4)
        # scrolledtext
        '''
        scroll = tkst.ScrolledText(self,width=90,height=15)
        scroll.grid(column=0,row=15, columnspan = 6, sticky='W')
        scroll.insert(tk.INSERT," OK here" +"\n")
        '''
        _FP_.focus()      # Place cursor into File Name Entry


if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

1 Ответ

1 голос
/ 06 февраля 2020

Я не уверен, что точно понимаю, что вы пытаетесь выполнить sh, но, думаю, я могу ответить на ваш вопрос о наличии ScrolledText, который будет работать с обоими классами - SampleApp и MainPage - в то же время.

Для этого я добавил еще один класс с именем SingleScroll, который называется классом " singleton ", поскольку он ограничивает число его экземпляры, которые могут быть созданы как «единичные».

Используется как SampleApp, так и MainPage точно так же, как обычный класс, и объект, возвращаемый при его вызове, передается OpenFile() функция в качестве аргумента для команд меню или кнопки в соответствующих классах.

import tkinter as tk                                                    # python 3
#from tkinter import ttk, font  as tkfont, messagebox as mb, filedialog # python 3
from tkinter import ttk
import tkinter.scrolledtext as tkst
from tkinter.ttk import *

# Global scope
FilePath = r"C:\Myfiles"
ScrollMsg = ""

# window definitions  ----------------------------------


# Menu definitions  ----------------------------------
def OpenFile(scroll): # Add a filedialog (file & directory chooser)
    global FilePath, ScrollMsg
    FilePath =  r"C:\Myfiles\file.txt"
    print("filedialog path & file :\n", FilePath)
    ScrollMsg = "filedialog path & file : " + FilePath
    print("SCROLL MESSAGE")
    print(ScrollMsg + "\n")
    scroll.insert(tk.INSERT, ScrollMsg + "\n" )

# SHARED SCROLL CLASS (ADDED) --------------------------
class SingleScroll:
    """ Singleton ScrolledText object. """
    def __new__(cls, master):
        if '_inst' not in vars(cls):  # Create instance?
            scroll = tkst.ScrolledText(master, width=90, height=15)
            scroll.grid(column=0, row=15, columnspan=6, sticky='W')
            scroll.insert(tk.INSERT, " OK here\n")
            cls._inst = scroll

        return cls._inst

# ------------------------------------------------------
class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.replace_frame(MainPage)
        scroll = SingleScroll(self)  # ScrolledText
        # Menu for all frames ----------------------------------
        menubar = tk.Menu(self)
        # File
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(label='Open', command=lambda: OpenFile(scroll))
        menubar.add_cascade(label='File', menu=filemenu)
        self.config(menu=menubar)

    def replace_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.grid()

# FRAME CLASSES --------------------------------------
class MainPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)

        lbl1 = tk.Label(self, text="File selection: ")
        lbl1.grid(column=0, row=1)

        lbl2 = tk.Label(self, text="File Path")
        lbl2.grid(column=0, row=2)

        _FP_ = Entry(self,width=30)
        _FP_.insert(0,FilePath) #set the item
        _FP_.grid(column=1, row=2)

        scroll = SingleScroll(master)  # ScrolledText
        btn = Button(self, text='OpenFile', command=lambda: OpenFile(scroll))
        btn.grid(column=0, row=4)
        _FP_.focus()      # Place cursor into File Name Entry


if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

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