Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 31, 2019 10:21:32

mario512
Зарегистрирован: 2019-08-31
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает скрипт.

Добрый день. Помогите совместить два скрипта, для реализации сервера печати, который висит в системном трее.
По отдельности работают, а вместе не хотят.

 #----------------------------
import socket
import threading
import tempfile
import win32api
import win32print
import wx.adv
import wx
TRAY_TOOLTIP = 'Name' 
TRAY_ICON = 'icon.png' 
def create_menu_item(menu, label, func):
    item = wx.MenuItem(menu, -1, label)
    menu.Bind(wx.EVT_MENU, func, id=item.GetId())
    menu.Append(item)
    return item
class TaskBarIcon(wx.adv.TaskBarIcon):
    def __init__(self, frame):
        self.frame = frame
        super(TaskBarIcon, self).__init__()
        self.set_icon(TRAY_ICON)
        self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)
    def CreatePopupMenu(self):
        menu = wx.Menu()
        create_menu_item(menu, 'Site', self.on_hello)
        menu.AppendSeparator()
        create_menu_item(menu, 'Exit', self.on_exit)
        return menu
    def set_icon(self, path):
        icon = wx.Icon(path)
        self.SetIcon(icon, TRAY_TOOLTIP)
    def on_left_down(self, event):      
        print ('Tray icon was left-clicked.')
    def on_hello(self, event):
        print ('Hello, world!')
    def on_exit(self, event):
        wx.CallAfter(self.Destroy)
        self.frame.Close()
class App(wx.App):
    def OnInit(self):
        frame=wx.Frame(None)
        self.SetTopWindow(frame)
        TaskBarIcon(frame)
        return True
def main():
    app = App(False)
    app.MainLoop()
if __name__ == '__main__':
    main()
bind_ip = "127.0.0.1"
bind_port = 9999
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip,bind_port))
server.listen(5)
print ('[*] Listening on %s:%d' % (bind_ip,bind_port))
# this is our client-handling thread
def handle_client(client_socket):
# print out what the client sends
        request = client_socket.recv(1024)
        print ("[*] Received: %s" % request)
# send back a packet
        client_socket.send("ACK!")
        client_socket.close()
while True:
    client,addr = server.accept()
    data = client.recv(1024).decode()
    print(data)
        
    print ("[*] Accepted connection from: %s:%d" % (addr[0],addr[1]))
        
    txtprint = str(data)
    print(txtprint)
    filename = tempfile.mktemp (".txt")
    print(txtprint)
    open (filename, "w").write (txtprint)
    win32api.ShellExecute (
       0,
       "printto",
       filename,
       '"%s"' % win32print.GetDefaultPrinter (),
       ".",
       0
    )    
# spin up our client thread to handle incoming data
client_handler = threading.Thread(target=handle_client,args=(client,))
client_handler.start()
#------------------------------

Прикреплённый файлы:
attachment Сервер2.py (2,6 KБ)

Офлайн

#2 Авг. 31, 2019 11:43:21

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Не работает скрипт.

mario512
а вместе не хотят.
Надо конкретно указывать что вас не устраивает в работе скрипта.

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

Второй скрипт кстати некорректен нет синхронизации основного и вспомогательного треда.



Офлайн

#3 Авг. 31, 2019 12:55:53

mario512
Зарегистрирован: 2019-08-31
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает скрипт.

doza_and
Складывается впечатление что вы записали один скрипт за другим. Как написали, так и будет работать. Сначала полностью выполнится и завершится один скрипт, потом другой.
Да, так и написал. Задача заключается в том что скрипт должен сидеть в трее и принимать запросы с заданиями на печать.

Офлайн

#4 Авг. 31, 2019 18:14:41

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Не работает скрипт.

wx.Timer ?



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#5 Сен. 1, 2019 08:13:34

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Не работает скрипт.

AD0DE412
wx.Timer ?
Таймер тут совершенно не нужен. Поллинг сокета это уж совсем некультурно. Либо как тут пытались сделать с тредами. Но конечно не так как ТС пробовал сделать. Тут три длительные процедуры. Ожидание клиентов, получение от них данных и печать. Так что нужны очереди синхронизация и прочая радость.
Я делал по другому. wxpython можно пересадить на asyncio event loop. Тогда все получится гораздо красивее. Получение данных элементарно короутинами. И очередь задачек на печать при необходимости легко реализуется средствами asyncio (Очевидно очередь задачек не нужна если вы не собираетесь отменять печать и используете очередь ОС как при использовании startfile). Синхронизация при этом уже не нужна.
Ну и конечно win32api тут как пятое колесо у телеги.

Вполне достаточно стандартных средств питона
https://stackoverflow.com/questions/12723818/print-to-standard-printer-from-python
А при использовании wx все уже решено
https://wiki.wxpython.org/Printing%20framework%20%28Phoenix%29



Отредактировано doza_and (Сен. 1, 2019 08:24:32)

Офлайн

#6 Сен. 1, 2019 19:32:40

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Не работает скрипт.

doza_and это все замечательно (спсб, вы слишком хорошего мнения обо мне, я половину не понимаю о чем вы (хорошо бы половину если чесно, но я буду работать над этим)) но что меня смущеет так это:

 ...
# print out what the client sends
        request = client_socket.recv(1024)
        print ("[*] Received: %s" % request)
# send back a packet
        client_socket.send("ACK!")
        client_socket.close()
while True:
#-------------------------------------------->>> КАК ПОПАСТЬ ОТ СЮДА
    client,addr = server.accept()
    data = client.recv(1024).decode()
    print(data)
        
    print ("[*] Accepted connection from: %s:%d" % (addr[0],addr[1]))
        
    txtprint = str(data)
    print(txtprint)
    filename = tempfile.mktemp (".txt")
    print(txtprint)
    open (filename, "w").write (txtprint)
    win32api.ShellExecute (
       0,
       "printto",
       filename,
       '"%s"' % win32print.GetDefaultPrinter (),
       ".",
       0
    )    
#-------------------------------------------->>> СЮДА
# spin up our client thread to handle incoming data
client_handler = threading.Thread(target=handle_client,args=(client,))
client_handler.start()
кроме того open (filename, “w”).write (txtprint) лучше наверное черз with ну и с close конечно
ну и это то же (наверное)
doza_and
Второй скрипт кстати некорректен нет синхронизации основного и вспомогательного треда



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Сен. 1, 2019 19:57:41)

Офлайн

#7 Сен. 2, 2019 19:11:31

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Не работает скрипт.

AD0DE412
но что меня смущеет так это:
Если коротко то никак.
Я бы не стал искать глубинный смысл в коде созданным человеком который верит что если скопировать один за другим два скрипта то они будут правильно и одновременно работать.

Рекомендую пользоваться документацией
https://docs.python.org/3/library/socket.html

Потеря close не фатальна. Можно даже считать это допустимой практикой.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version