FTPGui实验

GUI基本情况

  1. 连接登录界面
  2. 若用户名和密码正确,点击连接则进入上传下载界面

tkinter 注意事项

  1. 按钮事件的command参数如果调用了函数如command=self.button_on_click()会直接执行函数,而不是等待按钮被按下才执行,需将其改成command=self.button_on_click
  2. 如果在类ClientGui的某个函数如set_init_window()中定义了一些变量如文本输入框user_name_entry,同时类中其他函数可能也需要获取这个文本框的数据时,那么在set_init_window()中定义时,需self.user_name_entry而不能user_name_entry

解决上传文件的问题

  1. 在上传实验中,输入文件名再点击Upload按钮,会报错

    ftplib.error_perm: 550 Not enough privileges

  2. 如果文件名输错,则会报FileNotFoundError,这是没有问题的

  3. 发现一个问题,当我通过UI进行登录,点击connect按钮后,在服务端记录到:先有正常的(相当于已注册的用户)登录,随即有匿名用户在同一时间登录
  4. 而当我使用测试程序进行上传操作时,只有user登录,这个应该就是问题所在了
  5. 考虑到,在Gui代码中,我先在connect_button_on_click函数中调用FTP()函数,又在创建连接按钮这个组件时,使用command参数将connect_button_on_click调用了一边,猜想,是因为在此处连接了两遍导致新增匿名用户
  6. 同时,想到在点击事件的函数中,使用的变量是self的,这其实在某种程度上相当于在类中大家通用的变量。为了只调用一次FTP连接,准备将点击事件函数中新增参数user_namepwd
  7. 这里回到了旧问题:如果在command中包含参数,则不点击按钮也会执行函数。。
  8. 还是回到了原先的版本。。
  9. 问题找到了,当看到点击事件函数中被我添加的messagebox时,我悟了,这是又login了一次。所以我将这行注释掉以后,即可正常上传了

打包项目

安装pyinstaller参考

  1. pyinstaller -D ftpClient时遇到报错

    PermissionError: [Errno 13] Permission denied: ‘D:\Projects\PyCharmProjects\ftpClient’

  2. 以管理员身份运行Anaconda环境未果
  3. pyinstaller -F ftpClientGui.py是没有问题的

ftpClientGui.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from tkinter import *
from tkinter import messagebox
from ftplib import FTP
import ftpClient


class ClientGui:
def __init__(self, init_window_name):
self.init_window_name = init_window_name

def set_init_window(self):
"""
set options of our window
"""
self.init_window_name.title("ftpClient") # window title

# set window size and location(center)
width = 400
height = 160
self.screen_width = self.init_window_name.winfo_screenwidth()
self.screen_height = self.init_window_name.winfo_screenheight()
align_str = "%dx%d+%d+%d" % (width, height, (self.screen_width - width) / 2, (self.screen_height - height) / 2)
self.init_window_name.geometry(align_str)

# set label and entry of user's info
user_name_label = Label(self.init_window_name, text="user name")
user_name_label.place(x=50, y=40)

self.user_name_entry = Entry(self.init_window_name)
self.user_name_entry.place(x=150, y=40)

pwd_label = Label(self.init_window_name, text="password")
pwd_label.place(x=50, y=70)

self.pwd_entry = Entry(self.init_window_name, show="*")
self.pwd_entry.place(x=150, y=70)

# login button
connect_button = Button(self.init_window_name, text="connect",
command=self.connect_button_on_click)
connect_button.place(x=150, y=110)

def connect_button_on_click(self):
self.ftp = FTP(ftpClient.HOST, self.user_name_entry.get(), self.pwd_entry.get())
# show connection status
# messagebox.showinfo(title="Connection Status", message=self.ftp.login())
self.next_window()

def next_window(self):
"""
when connect button on click, start next window to transfer files
"""
self.transfer_ui = Toplevel()
self.transfer_ui.title("Transfer UI")
next_width = 400
next_height = 160
next_align_str = "%dx%d+%d+%d" % (next_width, next_height,
(self.screen_width - next_width) / 2, (self.screen_height - next_height) / 2)
self.transfer_ui.geometry(next_align_str)

# upload and download files
path_label = Label(self.transfer_ui, text="Path/Name")
path_label.place(x=70, y=40)
self.path_entry = Entry(self.transfer_ui)
self.path_entry.place(x=170, y=40)
upload_button = Button(self.transfer_ui, text="Upload", command=self.upload_button_on_click)
upload_button.place(x=100, y=75)
download_button = Button(self.transfer_ui, text="Download", command=self.download_button_on_click)
download_button.place(x=200, y=75)

def download_button_on_click(self):
file_name = self.path_entry.get()
self.ftp.retrbinary(('RETR ' + file_name), open(file_name, "wb").write)

def upload_button_on_click(self):
file_name = self.path_entry.get()
self.ftp.storbinary(('STOR ' + file_name), open(file_name, "rb"))


def gui_start():
init_window = Tk()
ftp_client = ClientGui(init_window)
ftp_client.set_init_window()
init_window.mainloop()


gui_start()


----------- 本文结束 -----------




0%