tkinter: как получить результат от кнопки и использовать его в функции? - PullRequest
0 голосов
/ 31 января 2020

Я хочу, чтобы пользователь щелкнул по кнопке под названием «выбрать папку», и это позволило ему выбрать папку из своего каталога, а затем по кнопке под названием «выберите csv», и это позволило ему выбрать csv. Затем я хочу, чтобы пользователь щелкнул разницу в цене, где он получит эти пути к папкам и найдет разницу в цене в файле.

Я создал функции для получения пути к папке и csv, но у меня возникают проблемы с возвратом результатов от пользователя на avgprice().

Вот код, который у меня есть на данный момент:

import tkinter as tk
global folder_path
import tkinter.ttk
from tkinter import filedialog
from tkinter import *
import pandas as pd
from tkinter.filedialog import askopenfilename
LARGE_FONT= ("Verdana", 12)


class SeaofBTCapp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        frame = StartPage(container, self)
        self.frames[StartPage] = frame
        frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()


class StartPage(tk.Frame):
    def __init__(self, parent, controller):
            tk.Frame.__init__(self,parent)
            label = tk.Label(self, text="BTC Price Difference", font=LARGE_FONT)
            label.pack(pady=10,padx=10)
            first_window_button = tk.Button(self, text="select Folder", command= self.browse_button)
            first_window_button.pack()
            first_window_csv_button = tk.Button(self, text="select csv", command= self.import_csv_data)
            first_window_csv_button.pack()
            first_window_diffbutton = tk.Button(self, text="Price difference", command= self.avgprice)
            first_window_diffbutton.pack()
            closebutton=tk.Button(self,text="Quit",command=controller.destroy)
            closebutton.pack()

    def browse_button(self):
        # Allow user to select a directory and store it in global var
        #called folder_path
        folder_path = StringVar()
        filename = filedialog.askdirectory()
        folder_path.set(filename)
        return filename

    def import_csv_data(self):
        csv_file_path = askopenfilename()
        df = pd.read_csv(csv_file_path)
        return df

    def avgprice(self):
        path1=self.browse_button()
        path2=self.import_csv_data()

Я столкнулся с проблемой в avgprice(), так как я не хочу, чтобы окно выбора файла появлялось снова, я просто хочу сохранить записи из того, что выбрал пользователь при нажатии всех кнопок. Есть ли способ использовать .get() здесь?

1 Ответ

0 голосов
/ 31 января 2020

Я вижу несколько вещей здесь.

  1. вы используете global в классе. Вместо этого используйте атрибут класса.

  2. self.askopenfilename неправильно, это просто askopenfilename. самостоятельно. заставит программу искать атрибут класса с именем self.askopenfilename, который не существует, что приведет к ошибке.

  3. у вас есть v.set(), но вы не определили v, что приведет к ошибке также. Это снова должен быть атрибут класса.

  4. pd не определен. Я предполагаю, что это из pandas или из какой-либо другой библиотеки, которая может читать csv, но вы не показываете это при импорте.

  5. path2=self.import_csv_data ничего не делает.

  6. Вы используете global folder_path в глобальном пространстве имен. global не используется таким образом и в этом случае ничего не делает. global используется внутри функции, чтобы сообщить этой функции, что переменная существует вне функции в глобальном пространстве имен, поэтому использование ее в глобальном пространстве имен бессмысленно.

  7. Вы уже делаете import tkinter as tk, вам также не нужно делать from tkinter import *. Метод * может привести к перезаписи методов, если вы не будете осторожны, поэтому предпочтительным методом импорта tkinter является использование import tkinter as tk и просто использование префикса tk. для всего.

Приведенный в порядок пример. Дайте мне знать, если у вас есть какие-либо вопросы:

import tkinter as tk
from tkinter import filedialog
from tkinter.filedialog import askopenfilename

LARGE_FONT = ("Verdana", 12)


class SeaofBTCapp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)
        container.grid(row=0, column=0, sticky='ew')
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        frame = StartPage()
        self.frames[StartPage] = frame
        frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()


class StartPage(tk.Frame):
    def __init__(self):
        super().__init__()
        self.v = ''
        self.file_path = ''
        self.folder_path = ''

        tk.Label(self, text="BTC Price Difference", font=LARGE_FONT).pack(pady=10, padx=10)
        tk.Button(self, text="select Folder", command=self.browse_button).pack()
        tk.Button(self, text="select csv", command=self.import_csv_data).pack()
        tk.Button(self, text="Price difference", command=self.avgprice).pack()
        tk.Button(self, text="Quit", command=self.master.destroy).pack()

    def browse_button(self):
        filename = filedialog.askdirectory()
        print(filename)
        self.folder_path = filename

    def import_csv_data(self):
        csv_file_path = askopenfilename()
        print(csv_file_path)
        self.file_path = csv_file_path
        # df = pd.read_csv(csv_file_path)

    def avgprice(self):
        path1 = self.folder_path
        path2 = self.file_path
        print('folder_path: ', path1)
        print('file_path: ', path2)


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