вызов кода python из java: askopenfilename не работает

#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 .