Tkinter даже не может вызвать простую & ldquo; кнопку & rdquo;

Apache FTPClient не поддерживает SFTP на данный момент. Тем не менее, вы можете использовать JSch-Java Secure Channel.

Onkar Joshi более подробно описывает библиотеку, используемую для FTP, SFTP, передачи файлов FTPS в Java.

Пример использования JSch для передачи файлов с SFTP выглядит следующим образом:

    ...

private static final Logger logger = Logger.getLogger(YourClass.class.getName());

public boolean sendDataViaSFTP(String contents) throws Exception {
    String hostname = "";
    String username = "";
    String password = "";
    String remoteDirectory = "";
    int ftpPort = 22;

    logger.info("***   Creating FTP session.   ***");
    JSch jsch = new JSch();
    Session session = null;
    Channel channel = null;
    ChannelSftp c = null;

    //Now connect and SFTP to the SFTP Server
    try {
        //Create a session sending through our username and password
        session = jsch.getSession(username, hostname, ftpPort);
        logger.info("***   FTP Session created.   ***");
        session.setPassword(password);

        //Security.addProvider(new com.sun.crypto.provider.SunJCE());
        //Setup Strict HostKeyChecking to no so we dont get the
        //unknown host key exception
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        logger.info("***   Session connected.   ***");

        //Open the SFTP channel
        logger.info("***   Opening FTP Channel.   ***");
        channel = session.openChannel("sftp");
        channel.connect();
        c = (ChannelSftp) channel;

        //Change to the remote directory
        logger.info("***   Changing to FTP remote dir: " + remoteDirectory + "   ***");
        c.cd(remoteDirectory);

        //Send the file we generated
        try {
            String filename = "myfile.txt";

            logger.info("***   Storing file as remote filename: " + filename + "   ***");

            ByteArrayInputStream bis = new ByteArrayInputStream(contents.getBytes());
            c.put(bis, filename);
            return true;
        } catch (Exception e) {
            logger.info("***   Storing remote file failed. " + e.toString() + "   ***");
            throw e;
        }
    } catch (Exception e) {
        logger.info("***   Unable to connect to FTP server. " + e.toString() + "   ***");
        throw e;
    } finally {
        //
        //Disconnect from the FTP server
        //
        try {
            if(session != null)
                session.disconnect();

            if(channel != null)
                channel.disconnect();

            if(c != null)
                c.quit();
        } catch (Exception exc) {
            logger.severe("***   Unable to disconnect from FTP server. " + exc.toString()+"   ***");
        }

        logger.info("***   SFTP Process Complete.   ***");
    }

}

...

0
задан Miraj50 16 January 2019 в 13:39
поделиться

2 ответа

Единственный способ воспроизвести вашу ошибку - это создать код непосредственно в оболочке IDLE и закрыть всплывающее корневое окно перед созданием кнопки.

enter image description here

Тем не менее, очень странно писать GUI в командной консоли следующим образом. Если вы не закрываете окно tkinter, код работает нормально. Однако разработку GUI следует выполнять в редакторе в файле .py и запускать сразу. Простое решение состоит в том, чтобы не закрывать корневое окно, пока все остальное в графическом интерфейсе не было добавлено.

Надлежащее решение - построить графический интерфейс в файле .py, а затем запустить его.

Я не уверен, почему вы говорите, что редактор не работает для вас. Когда я копирую ваш точный код, он прекрасно работает с моей стороны:

enter image description here

Все, что говорит, что вам действительно не нужно создавать свой код в Python IDLE. Было бы намного лучше использовать что-то вроде PyCharm или Eclipse / PyDev. Это мои инструменты Go to IDE.

Стоит отметить, что в Python IDLE не будет запускать код из редактора, пока вы не сохраните файл .py.

Хотя в Python IDLE не требуется 100%, mainloop() является обязательным требованием для корректной работы tkinter. Вне Python IDLE большинство других сред IDE требуют mainloop(), поэтому рекомендуется всегда включать его.

import tkinter as tk

root = tk.Tk()
b = tk.Button(root, text='button')
b.pack()
root.mainloop()
0
ответ дан Mike - SMT 16 January 2019 в 13:39
поделиться

Я думаю, вы забыли добавить root.mainloop() в конце.

import tkinter as tk

root = tk.Tk()

b = tk.Button(root, text='button'); b.pack()

root.mainloop()
0
ответ дан 16 January 2019 в 13:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: