Я новичок в python и Tkinter, пожалуйста, несите грязный код.
В настоящее время у меня есть 2 кнопки (одна - открытый файл, вторая - запущена) и 1 текстовое поле (Ввод или Scrolledtext), то, что я хочу сделать, это
- , нажмите кнопку открытия файла, тогда путь к файлу будет отображен в текстовом поле, и этот путь также будет сохранен в локальной переменной 'a' в main ().
- когда я нажимаю кнопку «Выполнить», программа получает последнее значение переменной «a» и делает что-то еще.
Проблема, с которой я столкнулся, заключается в том, что эта локальная переменная ' «невозможно обновить, пока я нажимаю кнопку« открыть файл ». Я ищу подобные вопросы и получаю ответ, что я должен использовать 'global var' или 'создать класс и трактовать путь к файлу как атрибут'. Но почему-то я не смог этого сделать. Позвольте мне поместить мой код ниже.
Сначала используется глобальная переменная. Я могу получить обновленный файл1, нажав «btn_run», консоль напечатает последнее значение файла один, но script_path не может быть обновлен.
ps Я также пробую метод trace (). да, я обнаружил, что вар. в функции могут быть обновлены, но как я могу получить эти обновленные var в моей локальной переменной main? Кажется, go снова возвращается к исходной точке.
from functools import partial
from tkinter import scrolledtext,INSERT,END,Entry, messagebox, filedialog, ttk, Frame,Button
from os import path
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2TkAgg
# Tkagg allows you to draw, navigation bar is to allow you save, zoomm ....the images
import numpy as np
from tkinter import *
def openfile(txt1):
global file1
file1= filedialog.askopenfilename(filetypes=(("all files","*.*"),("Text files","*.txt"),("csv file","*.csv")))
txt1.insert(0,file1)
# print (file1)
def print_f1():
print(file1)
def main ():
# Create Main window
window = Tk()
file1=''
window.title("WADC FFT trial")
window.minsize(1000,600)
input_str=StringVar()
input_str.set('')
# Create Frame for buttons, bars and picts
mis_frame = Frame(window)
mis_frame.grid(column=0, row=0)
#Create a scrolled text box on mis_frame
txt=Entry(mis_frame,textvariable=input_str,width=40)
txt.grid(column=0,row=0)
#define openfile
#Create a button on mis_frame, use lambda to avoid direct invoke the function called
# btn_path= Button(mis_frame,text="Open File",command=lambda:openfile(txt1))
#another workaround is to use partial funciton in python, assign a new func with lesser variables.
op_func=partial(openfile,txt)
btn_path=Button(mis_frame,text='Open File',command=op_func)
btn_path.grid(column =1,row =0)
script_path=input_str
print('script path is '+str(script_path))
btn_run = Button(mis_frame, text='Run',command=print_f1)
btn_run.grid(column=3,row=0,padx=100)
window.mainloop()
if __name__=='__main__':
main()
Второй идет с атрибутом класса. на этот раз я делаю только 1 кнопку, которая может открыть файл и получить путь к файлу. Суть в том, что я хочу передать это «имя файла» локальной переменной «а», дело в том, что я запускаю код, оно передаст «а» значение по умолчанию «имя файла» и не будет обновляться после того, как я нажму «Обзор» Кнопка.
Спасибо за ваши предложения, это может быть полезно
from tkinter import *
import tkinter as tk
class Canvas(tk.Tk): #inherient from Tkinter.tk
def __init__(self):
tk.Tk.__init__(self) #inheritate all attributes that tk has
self.filename ='' #declare filepath
tk.Button(self, text='Browse', command=self.openfile).grid(column=0,row=0)
def openfile(self):
self.filename = filedialog.askopenfilename(title="Open file")
def main ():
b=Canvas()
b.title("Test")
b.minsize(600,400)
a=b.filename
print(a)
b.mainloop()
if __name__=='__main__':
main()