我正在使用Jython中的Swing,我发现虽然System.exit()
(来自java.lang
)或JFrame.setDefaultCloseOperation(EXIT_ON_CLOSE)
正常工作,但是sys.exit()
会挂起。
显然,一个函数是通过atexit.register
注册的,它等待所有线程退出,正如Python中预期的那样(这实际上与Java不同)。
这意味着如果调用ActionListener
(例如,当点击JButton
时),AWT的事件调度线程将被生成,并且调用sys.exit()
将永远挂起,等待它退出。
以下是一个示例:https://gist.github.com/2877919。除非首先单击按钮,否则关闭框架将退出程序。
退出Jython应用程序的最佳方法是什么?使用EXIT_ON_CLOSE
或System.exit()
会完全忽略atexit
...
答案 0 :(得分:0)
我认为你不需要多线程,你只需要确保窗口没有关闭,直到你想要。关闭窗口时,关闭系统:
from javax.swing import JFrame, JButton, JOptionPane
from java.awt.event import ActionListener, WindowAdapter
import sys
class Frame(JFrame, ActionListener):
def __init__(self):
self.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE)
button = JButton("Hello", actionCommand='button')
button.addActionListener(self)
self.getContentPane().add(button)
self.pack()
self.setResizable(False)
def actionPerformed(self, event):
print event.getActionCommand();
class Adapter(WindowAdapter):
def windowClosing(self, event):
if JOptionPane.showConfirmDialog(None, "Wanna exit?","Jython Test", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION:
sys.exit(0)
if __name__ == '__main__':
frame = Frame();
frame.setVisible(True)
frame.addWindowListener(Adapter())