我只是撰寫一個用于資料分析的小 GUI,我認為最好為帶有 tkinter 的 GUI 內容和另一個檔案中的功能內容創建一個檔案。但是,不知何故,我無法將正確的值傳遞給函式所在的模塊。問題的簡化版:一個檔案是GUI.py:
import tkinter as tk
from tkinter import filedialog as fd
import readBinary as rb
import functools as ft
filename = "EXTERNAL"
def mytest():
global filename
filename = fd.askopenfilename(filetypes=(("Binary Data", "*.bin"),("All files", "*.*")))
print(filename)
def printtest():
global filename
print(filename)
def gui():
global filename
root = tk.Tk()
openB = tk.Button(master=root,text="File",command=mytest)
openB.pack()
printB = tk.Button(master=root,text="Print",command=printtest)
printB.pack()
#filename = "INTERNAL"
test = tk.Button(master=root,text="Test",command=ft.partial(rb.doIt,filename))
test.pack()
root.mainloop()
if __name__ == "__main__":
gui()
另一個檔案,在本例中名為 readBinary.py:
def doIt(filename):
print(filename)
if __name__ == "__main__":
pass
現在的問題是:
- 使用 printtest 和匯入的 doIt 函式,它會列印“EXTERNAL”,這很清楚。
- 當呼叫 mytest() 并選擇一個檔案時,它會列印該檔案的路徑。此外,當我現在呼叫 printtest 時,它會列印路徑。但匯入的 doIt 仍然列印“EXTERNAL”
- 另一方面,當我在 gui() 函式中取消注釋 filename = "INTERNAL" 時,printtest 和匯入的 doIt 都會列印 "INTERNAL"
因此,引數傳遞似乎有效,并且可以從 gui() 函式訪問所選檔案中的檔案名。那么這種組合怎么可能給出錯誤的結果呢?
uj5u.com熱心網友回復:
除了您使用的partial不是您打算使用的方式這一事實之外,這里還有一個小修復程式可以實作您的預??期行為。
而不是filename在使用時傳遞 的值partial,您必須傳遞物件的參考,您可以從中訪問 的更新值filename。在這里,我使用了一個Class物件。您也可以將其包裹在list,dict或其他物件中。
import tkinter as tk
from tkinter import filedialog as fd
import readBinary as rb
import functools as ft
class FILE:
name = "EXTERNAL"
def mytest():
return_value = fd.askopenfilename(filetypes=(("Binary Data", "*.bin"), ("All files", "*.*")))
if return_value:
FILE.name = return_value
print(FILE.name)
def printtest():
print(FILE.name)
def gui():
root = tk.Tk()
openB = tk.Button(master=root, text="File", command=mytest)
openB.pack()
printB = tk.Button(master=root, text="Print", command=printtest)
printB.pack()
test = tk.Button(master=root, text="Test", command=ft.partial(rb.doIt, FILE))
test.pack()
root.mainloop()
if __name__ == "__main__":
gui()
讀取二進制檔案
def doIt(class_obj):
print(class_obj.name)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/331308.html
上一篇:如何即時回傳一個WM_COPYDATA訊息,并同時呼叫一個函式?
下一篇:更改畫布文本位置tkinter
