Помогите с QToolBar()
Помогите сделать рабочий ToolBar, на строчке с 53-59 стараюсь это сделать но при запуске этого нет.
import sys
import ftplib
import easygui
import pyperclip
import os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget, QGridLayout, QPushButton, QGraphicsOpacityEffect
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication, QMenuBar, qApp
from PyQt5.QtWidgets import QFileSystemModel, QHBoxLayout, QShortcut, QInputDialog
from PyQt5.QtWidgets import QTreeWidgetItem, QVBoxLayout, QMenu, QSplitter
from PyQt5.QtCore import QUrl, QRect, QFileInfo, Qt, QSize, QDir
from PyQt5.QtGui import QIcon, QKeySequence
class App(QWidget):
def __init__(self):
super().__init__()
self.splitter = QSplitter(Qt.Horizontal)
self.hbox = QHBoxLayout(self)
self.vbox = QVBoxLayout()
self.grid = QGridLayout(self)
self.hbox.addWidget(self.splitter)
self.setLayout(self.hbox)
self.columns = ['Name', 'Size']
self.menubar = QMenuBar(self)
self.file = self.menubar.addMenu('&File')
self.exitAction = QAction(QIcon('cross-exit.ico'), '&Exit', self)
self.exitAction.setShortcut('Ctrl+Q')
self.exitAction.setStatusTip('Exit application')
self.exitAction.triggered.connect(self.close)
self.file.addAction(self.exitAction)
self.server = self.menubar.addMenu('Server')
self.connectAction = QAction(QIcon('cross-exit.ico'), 'Connect server', self)
self.connectAction.setStatusTip('Connect server')
self.connectAction.triggered.connect(self.connect_FTP_server)
self.connectAction.triggered.connect(self.ftp_lst)
self.server.addAction(self.connectAction)
self.disconnectAction = QAction(QIcon('cross-exit.ico'), 'Disconnect server', self)
self.disconnectAction.setStatusTip('Disconnect server')
self.disconnectAction.triggered.connect(self.disconnect_FTP_server)
self.server.addAction(self.disconnectAction)
self.updateAction = QAction(QIcon('cross-exit.ico'), 'Update list file', self)
self.updateShortcut = QShortcut(QKeySequence("F5"), self)
self.updateShortcut.activated.connect(self.ftp_lst)
self.updateAction.setStatusTip('Update list file')
self.updateAction.triggered.connect(self.ftp_lst)
self.server.addAction(self.updateAction)
self.exitAction = QAction(QIcon('disconnect.png'), 'Exit', self)
self.exitAction.setShortcut('Ctrl+Q')
self.exitAction.triggered.connect(self.disconnect_FTP_server)
self.tool = QtWidgets.QToolBar()
self.tool.addWidget(QtWidgets.QPushButton("Tool 1"))
self.tool.addWidget(QtWidgets.QPushButton("Tool 2"))
self.grid.addWidget(self.tool, 1, 0)
self.FTP_tree = QtWidgets.QTreeWidget()
self.FTP_tree.setHeaderLabels(self.columns)
self.FTP_tree.setDisabled(True)
self.FTP_tree.itemDoubleClicked.connect(self.downloading_from_server)
self.splitter.addWidget(self.FTP_tree)
self.model = QFileSystemModel(self)
self.model.setRootPath('')
self.tree = QtWidgets.QTreeView()
self.tree.setModel(self.model)
self.tree.setAnimated(False)
self.tree.setIndentation(20)
self.tree.setSortingEnabled(True)
# self.vbox.addLayout(self.grid)
self.tree.clicked.connect(self.on_treeView_clicked)
self.tree.clicked.connect(self.uploading_files_to_server)
self.splitter.addWidget(self.tree)
@QtCore.pyqtSlot(QtCore.QModelIndex)
def on_treeView_clicked(self, index):
indexItem = self.model.index(index.row(), 0, index.parent())
self.filePath = self.model.filePath(indexItem)
if QFileInfo(self.filePath).completeSuffix() != '':
return self.filePath
else:
pass
def disconnect_FTP_server(self):
self.ftp.close()
self.FTP_tree.clear()
self.FTP_tree.setHeaderLabels(self.columns)
self.FTP_tree.setDisabled(True)
def word_getWelcome(self):
str1 = self.ftp.getwelcome()
self.words = str1.split()
def connect_FTP_server(self):
msg = "Введите информацию о сервере"
fieldNames = ["IP Сервера", "Логин", "Пароль"]
title = 'FTP'
self.ftp_log = easygui.multpasswordbox(msg, title, fieldNames)
try:
self.ftp = ftplib.FTP("192.168.0.1" ,"Artem" ,"1204")
self.ftp.encoding = 'utf-8'
self.ftp.set_pasv(False)
except TypeError:
pass
return self.ftp
def ftp_lst(self):
self.FTP_tree.clear()
self.FTP_tree.setHeaderLabels(self.columns)
self.FTP_tree.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.FTP_tree.customContextMenuRequested.connect(self.openMenu)
self.FTP_tree.setDisabled(False)
self.FTP_item1 = QTreeWidgetItem(self.FTP_tree, ['..'])
self.nlst = self.ftp.nlst()
self.nlst_len = len(self.nlst)
for i in self.nlst:
j = []
j.append(i)
j.append(str(self.ftp.size(i)))
self.FTP_item1 = QTreeWidgetItem(self.FTP_tree, j)
self.FTP_item1.setFlags(self.FTP_item1.flags() | QtCore.Qt.ItemIsEditable)
# self.splitter.addWidget(self.FTP_tree)
self.file_lst = self.ftp.nlst()
self.len_file_lst = len(self.nlst)
self.setLayout(self.hbox)
# self.FTP_tree = QtWidgets.QTreeWidget()
def openMenu(self, position):
self.position = position
self.menu = QtWidgets.QMenu()
self.delete = QtWidgets.QAction('Delete', self.menu)
self.menu.addAction(self.delete)
self.delete.triggered.connect(self.delete_file)
self.new_folder_open = QtWidgets.QAction('Create a folder and open', self.menu)
self.menu.addAction(self.new_folder_open)
self.new_folder_open.triggered.connect(self.newfolderopen)
self.copy_to_clipboard = QtWidgets.QAction('Copy to clipboard', self.menu)
self.menu.addAction(self.copy_to_clipboard)
self.copy_to_clipboard.triggered.connect(self.copytoclipboard)
self.new_folder = QtWidgets.QAction('New folder', self.menu)
self.menu.addAction(self.new_folder)
self.new_folder.triggered.connect(self.newfolder)
self.rename = QtWidgets.QAction('Rename', self.menu)
self.rename.triggered.connect(self.rename_file)
self.menu.addAction(self.rename)
if self.FTP_tree.itemAt(self.position) != None:
self.menu.exec_(self.FTP_tree.viewport().mapToGlobal(self.position))
else:
pass
def copytoclipboard(self):
a = f'ftp://{self.ftp_log[0]}{self.ftp.pwd()}/{self.FTP_tree.currentItem().text(0)}'
print(pyperclip.copy(a))
def newfolderopen(self):
text, ok = QInputDialog.getText(self, 'FTPZ',
'Enter a new folder name:')
a = self.FTP_tree.itemAt(self.position).text(0)
print(a)
if ok:
print(ok)
self.ftp.mkd(text)
b = f'{self.ftp.pwd()}/{text}'
self.ftp.cwd(b)
self.ftp_lst()
def newfolder(self):
text, ok = QInputDialog.getText(self, 'FTPZ',
'Enter a new folder name:')
a = self.FTP_tree.itemAt(self.position).text(0)
print(a)
if ok:
print(ok)
self.ftp.mkd(text)
self.ftp_lst()
def rename_file(self):
text, ok = QInputDialog.getText(self, 'FTPZ',
'Enter a new file name:')
a = self.FTP_tree.itemAt(self.position).text(0)
print(a)
if ok:
self.ftp.rename(a, text)
print(ok)
self.ftp_lst()
def delete_file(self):
self.name_file = self.FTP_tree.itemAt(self.position)
print(self.name_file)
self.ftp.delete(self.name_file.text(0))
self.ftp_lst()
def dwc(self):
url = self.ftp.pwd()
b = -2
while True:
if url[b] == '/':
c = url[:b]
break
else:
b -= 1
if c == '':
c = '/'
return c
def uploading_files_to_server(self):
f1 = open(self.filePath, "rb")
filename = QUrl(self.filePath).fileName()
self.ftp.storbinary("STOR" + filename, f1)
f1.close()
def downloading_from_server(self):
b = f'{self.ftp.pwd()}/{self.FTP_tree.currentItem().text(0)}'
c = QUrl(b).fileName()
if self.FTP_tree.currentItem().text(0) == '..':
self.ftp.cwd(self.dwc())
self.ftp_lst()
elif QFileInfo(c).completeSuffix() == '':
self.ftp.cwd(b)
self.ftp_lst()
else:
way = easygui.diropenbox()
host_file = os.path.join(
way, self.FTP_tree.currentItem().text(0)
)
try:
with open(host_file, 'wb') as local_file:
self.ftp.retrbinary('RETR ' + self.FTP_tree.currentItem().text(0), local_file.write)
except ftplib.error_perm:
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
ex.resize(640, 480)
ex.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Для меню и панели инструментов лучше использовать QMainWindow, в нем есть специально для этого созданные методы:
Обновил только конструктор:
class App(QMainWindow):
def __init__(self):
super().__init__()
self.splitter = QSplitter(Qt.Horizontal)
self.hbox = QHBoxLayout()
self.hbox.addWidget(self.splitter)
central_widget = QWidget()
central_widget.setLayout(self.hbox)
self.setCentralWidget(central_widget)
self.columns = ['Name', 'Size']
self.file = self.menuBar().addMenu('&File')
self.exitAction = QAction(QIcon('cross-exit.ico'), '&Exit', self)
self.exitAction.setShortcut('Ctrl+Q')
self.exitAction.setStatusTip('Exit application')
self.exitAction.triggered.connect(self.close)
self.file.addAction(self.exitAction)
self.server = self.menuBar().addMenu('Server')
self.connectAction = QAction(QIcon('cross-exit.ico'), 'Connect server', self)
self.connectAction.setStatusTip('Connect server')
self.connectAction.triggered.connect(self.connect_FTP_server)
self.connectAction.triggered.connect(self.ftp_lst)
self.server.addAction(self.connectAction)
self.disconnectAction = QAction(QIcon('cross-exit.ico'), 'Disconnect server', self)
self.disconnectAction.setStatusTip('Disconnect server')
self.disconnectAction.triggered.connect(self.disconnect_FTP_server)
self.server.addAction(self.disconnectAction)
self.updateAction = QAction(QIcon('cross-exit.ico'), 'Update list file', self)
self.updateShortcut = QShortcut(QKeySequence("F5"), self)
self.updateShortcut.activated.connect(self.ftp_lst)
self.updateAction.setStatusTip('Update list file')
self.updateAction.triggered.connect(self.ftp_lst)
self.server.addAction(self.updateAction)
self.exitAction = QAction(QIcon('disconnect.png'), 'Exit', self)
self.exitAction.setShortcut('Ctrl+Q')
self.exitAction.triggered.connect(self.disconnect_FTP_server)
self.tool = self.addToolBar('Tools')
self.tool.addWidget(QtWidgets.QPushButton("Tool 1"))
self.tool.addWidget(QtWidgets.QPushButton("Tool 2"))
self.FTP_tree = QtWidgets.QTreeWidget()
self.FTP_tree.setHeaderLabels(self.columns)
self.FTP_tree.setDisabled(True)
self.FTP_tree.itemDoubleClicked.connect(self.downloading_from_server)
self.splitter.addWidget(self.FTP_tree)
self.model = QFileSystemModel(self)
self.model.setRootPath('')
self.tree = QtWidgets.QTreeView()
self.tree.setModel(self.model)
self.tree.setAnimated(False)
self.tree.setIndentation(20)
self.tree.setSortingEnabled(True)
self.tree.clicked.connect(self.on_treeView_clicked)
self.tree.clicked.connect(self.uploading_files_to_server)
self.splitter.addWidget(self.tree)
...
Кусочек окна:
