#java #python #tkinter
Вопрос:
У меня есть программа на Java, которая вызывает пользовательский интерфейс Python tkinter.
это называется так:
Button button = new Button("Visualize Differences");
pane.add(button);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String pypath = System.getProperty("user.dir") "\source\vchange\viz.py";
String[] cmd = {
"python",
pypath,
};
// TODO Auto-generated method stub
try {
Process p = Runtime.getRuntime().exec(cmd);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
затем программа python принимает пользовательский ввод с помощью askopenfilename
def startcompare():
try:
t = threading.Thread(target=startPython.build(xml_old.get(),xml_new.get(),out_xml.get()))
t.daemon = True
t.start()
except:
messagebox.showerror("Title", "Error. Please enter valid path")
def browsefunc1():
filename = filedialog.askopenfilename(initialdir = path,filetypes=(("xml files","*.xml"),("All files","*.*")))
ent1.delete(0, 'end')
ent1.insert(tk.END, filename) # add this
def browsefunc2():
filename = filedialog.askopenfilename(initialdir = path,filetypes=(("xml files","*.xml"),("All files","*.*")))
ent2.delete(0, 'end')
ent2.insert(tk.END, filename) # add this
def browsefunc3():
filename = filedialog.askopenfilename(initialdir = path,filetypes=(("xml files","*.xml"),("All files","*.*")))
ent3.delete(0, 'end')
ent3.insert(tk.END, filename) # add this
l0 = tk.Label(root,text = 'Enter XML files for visualization.')
l1 = tk.Label(root,text = 'old entry:')
ent1=tk.Entry(root,textvariable=xml_old)
l2 = tk.Label(root,text = 'new entry:')
ent2=tk.Entry(root,textvariable=xml_new)
l3 = tk.Label(root,text = 'out.xml:')
ent3=tk.Entry(root,textvariable=out_xml)
b1=tk.Button(root,text="...",command=browsefunc1)
b2=tk.Button(root,text="...",command=browsefunc2)
b3=tk.Button(root,text="...",command=browsefunc3)
b4=tk.Button(root,text="OK",command=startcompare)
b5=tk.Button(root,text="Cancel",command=root.destroy)
Однако, когда я запускаю метод startcompare: он выдает ошибку.
Делая то же самое, ошибка не возникает, когда я запускаю ее из режима ожидания вместо программы Java.
Почему это происходит и как мне это решить?
Насколько я могу понять, это, вероятно, связано с моим файлом StartPython. StartPython находится в той же папке, что и код пользовательского интерфейса, и отлично работает при запуске из режима ожидания.
Заранее спасибо
====================================Редактировать================================== печать сообщение об ошибке я получаю следующее:
tmp.png-это изображение, которое я использую в StartPython. Однако все файлы находятся в одном каталоге:
Часть в StartPython, которая использует tmp.png, выглядит так:
image_filename = 'tmp.png'
Нужно ли мне изменять это значение?
Комментарии:
1. Попробуйте не использовать
try / except
операторы внутриstartcompare()
функции, чтобы увидеть фактическое возникшее исключение.2. @acw1668 Спасибо за ответ! Я поднял исключение и добавил более подробную информацию к вопросу.
3. Это может быть связано с тем, что текущий каталог не является каталогом
startPython.py
.4. @acw1668 Как мне сделать так, чтобы все они находились в «текущем каталоге»?
5. Лучше использовать полное имя пути внутри
startPython.py
:image_filename = os.path.join(os.path.dirname(__file__), 'tmp.png')
. Конечно, вам нужно добавитьimport os
и внутриstartPython.py
.