我有点卡住。我正在尝试创建一个Python程序,在其中单击Button1
时,它会请求一个具有IP的文本文件。检索到文本文件后,我想将textbox1
设置为该文本文件的路径。然后,当单击Button2
时,要求用户浏览.exe文件。检索.exe文件后,将textbox2's
文本再次设置为.exe文件的路径。此后,当用户单击“运行”按钮时,.exe文件将根据文本文件中的IP数量开始运行。如果文本文件中有2个IP,则将开始运行2个.exe文件,第一个.exe文件将运行IP1,第二个.IP文件将运行IP2。请注意,我是python的新手。
这是我的代码:
import os
from tkinter import *
from tkinter import filedialog
ipFilePath = ''
exeFilePath = ''
#FUNCTIONS
def browsefunc(): #browse button to search for files
ipFilePath = filedialog.askopenfilename()
return ipFilePath
def browsefunc2(): #browse button to search for files
exeFilePath = filedialog.askopenfilename()
return exeFilePath
def run():
with open(ipFilePath) as f:
for each_ip in f.readlines():
subprocess.Popen([exeFilePath, each_ip.rstrip()], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
time.sleep(2)
#GUI
root = Tk()
root.title('Map_Launcher')
root.geometry("698x150")
mf = Frame(root)
mf.pack()
f1 = Frame(mf, width=600, height=250) #file1
f1.pack(fill=X)
f2 = Frame(mf, width=600, height=250) #file2
f2.pack(fill=X)
f4 = Frame(mf, width=600, height=250) #run button
f4.pack()
ipFilePath = StringVar()
exeFilePath = StringVar()
Label(f1,text="Select file 1 (Only txt files)").grid(row=0, column=0,
sticky='e') #file1 button
entry1 = Entry(f1, width=50, textvariable=ipFilePath)
entry1.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Label(f2,text="Select file 2 (Only exe files)").grid(row=0, column=0,
sticky='e') #file2 button
entry2 = Entry(f2, width=50, textvariable=exeFilePath)
entry2.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Button(f1, text="Browse", command=browsefunc).grid(row=0, column=27,
sticky='ew', padx=8, pady=4)#file1 button
Button(f2, text="Browse", command=browsefunc2).grid(row=0, column=27,
sticky='ew', padx=8, pady=4)#file2 button
Button(f4, text="Run", width=32, command=lambda: run).grid(sticky='ew',
padx=10, pady=10)#run button
root.mainloop()
答案 0 :(得分:0)
您的代码中有几个错误:
缺少import subprocess
。
ipFilePath
和exeFilePath
被分配了两次:首先是空字符串,然后是StringVar()
。最好删除对空字符串的分配。
将值分配给StringVar
应该使用.set()
函数:
def browsefunc():
ipFilePath.set(filedialog.askopenfilename(filetypes=[("IP file","*.txt")]))
def browsefunc2():
exeFilePath.set(filedialog.askopenfilename(filetypes=[("Program file", "*.exe")]))
要获取StringVar
的值,应使用.get()
函数,最好使用subprocess.communicate()
而不是sleep()
:
def run():
with open(ipFilePath.get()) as f:
for each_ip in f.readlines():
p = subprocess.Popen([exeFilePath.get(), each_ip.rstrip()], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
只需为“运行”按钮的run
参数分配command
:
Button(f4, text="Run", width=32, command=run).grid(...)