Используя команду кнопки tkinter, как передать var из функции в локальную переменную в основной функции - PullRequest
0 голосов
/ 23 апреля 2020

Я новичок в python и Tkinter, пожалуйста, несите грязный код.

В настоящее время у меня есть 2 кнопки (одна - открытый файл, вторая - запущена) и 1 текстовое поле (Ввод или Scrolledtext), то, что я хочу сделать, это

  1. , нажмите кнопку открытия файла, тогда путь к файлу будет отображен в текстовом поле, и этот путь также будет сохранен в локальной переменной 'a' в main ().
  2. когда я нажимаю кнопку «Выполнить», программа получает последнее значение переменной «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()

1 Ответ

0 голосов
/ 23 апреля 2020

Проблемы

script_path=input_str 

присваивает StringVar значение script_path, а не его значение. Чтобы получить значение, используйте script_path = input_str.get()


Когда эта строка

a = b.filename

выполнена, ей присваивается значение имени файла по умолчанию для a, поскольку вы не вызывали openfile .


Решение

Чтобы передать значение в глобальную область, вам не нужны ни классы, ни глобальные ключевые слова. Просто используйте переменную tkinter

file1 = StringVar()
def openfile(txt1):
    file1.set(filedialog.askopenfilename(filetypes=( ("all files","*.*"),("Text files","*.txt"),("csv file","*.csv") ) ) )
    txt1.insert(0,file1) 

или заставьте ваши функции возвращать что-то.

def openfile(txt1):
    file1 = filedialog.askopenfilename(filetypes=( ("all files","*.*"),("Text files","*.txt"),("csv file","*.csv") ))
    txt1.insert(0,file1) 
    return file1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...