मैं क्या करने की कोशिश कर रहा हूं:

मैं मुख्य विंडो की बजाय अपूर्ण विंडो में लूप में तीन डिस्प्ले प्रदर्शित करने का प्रयास कर रहा हूं। मुझे वह त्रुटि मिल रही है जिसका उल्लेख नीचे किया गया है। इसलिए, मैं इसे चलाने में सक्षम नहीं हूं।

त्रुटि मुझे मिल रही है:

Exception in Tkinter callback

Traceback (most recent call last):

  File "C:\Users\sel\Anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)

  File "<ipython-input-19-df56c3798d6a>", line 91, in on_window
    show_figure(selected_figure)

  File "<ipython-input-19-df56c3798d6a>", line 53, in show_figure
    one_figure = all_figures[number]

IndexError: list index out of range

नीचे मेरा कोड है:

import tkinter as tk
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

all_figures = []
selected_figure = 0 

class MyClass():

    def __init__(self):

        self.sheets = [[1,2,3], [3,1,2], [1,5,1]]
        self.W = 2
        self.L = 5


    def plot_sheet(self, data):
        """plot single figure"""

        fig, ax = plt.subplots(1)

        ax.set_xlim([0, self.W]) 
        ax.set_ylim([0, self.L])

        ax.plot(data)

        return fig

    def generate_all_figures(self):
        """create all figures and keep them on list"""
        global all_figures

        for data in self.sheets:
            fig = self.plot_sheet(data)
            all_figures.append(fig)


dataPlot = None  


def on_window():

    def show_figure(number):
        global dataPlot

        # remove old canvas
        if dataPlot is not None: # at start there is no canvas to destroy
            dataPlot.get_tk_widget().destroy()

        # get figure from list
        one_figure = all_figures[number]

        # display canvas with figure
        dataPlot = FigureCanvasTkAgg(one_figure, master=window)
        dataPlot.draw()
        dataPlot.get_tk_widget().grid(row=0, column=0)

    def on_prev():
        global selected_figure

        # get number of previous figure
        selected_figure -= 1
        if selected_figure < 0:
            selected_figure = len(all_figures)-1

        show_figure(selected_figure)

    def on_next():
        global selected_figure

        # get number of next figure
        selected_figure += 1
        if selected_figure > len(all_figures)-1:
            selected_figure = 0

        show_figure(selected_figure)

    top = tk.Toplevel()
    top.wm_geometry("794x370")
    top.title('Optimized Map')

    selected_figure = 0
    dataPlot = None # default value for `show_figure`
    show_figure(selected_figure)

    frame = tk.Frame(top)
    frame.grid(row=1, column=0)

    b1 = tk.Button(frame, text="<<", command=on_prev)
    b1.grid(row=0, column=0)

    b2 = tk.Button(frame, text=">>", command=on_next)
    b2.grid(row=0, column=1)

window = tk.Tk()

b1 = tk.Button(window, text="Next", command=on_window)
b1.grid(row=0, column=0)

window.mainloop()
0
devinxxxd 29 अगस्त 2019, 14:52

1 उत्तर

सबसे बढ़िया उत्तर

आपने एक generate_all_figures के साथ एक वर्ग बनाया है लेकिन आपने एक MyClass ऑब्जेक्ट नहीं बनाया है और generate_all_figures() चलाते हैं इसलिए आपकी all_figures सूची खाली है। यही कारण है कि आपको एक IndexError मिलता है।

on_window() को क्रियान्वित करने से पहले आपको एक MyClass ऑब्जेक्ट बनाना होगा और अपनी all_figures सूची को पॉप्युलेट करने के लिए generate_all_figures()चलाना होगा:

window = tk.Tk()

mc = MyClass()
mc.generate_all_figures()

b1 = tk.Button(window, text="Next", command=on_window)
b1.grid(row=0, column=0)

window.mainloop()

वैसे, आपको generate_all_figures में global all_figures की आवश्यकता नहीं है (देखें पाइथन में सूचियों को वैश्विक चर के रूप में परिभाषित करना)।

1
j_4321 29 अगस्त 2019, 15:19