Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Message box close immediately after using py2exe

I use script:

#!/usr/bin/python
from uuid import getnode as get_mac
import socket
import requests
import datetime
import os

def main():
    print('start')
    i = datetime.datetime.now()
    #print ("Current date & time = %s" % i)
    headers = {"Content-Type": "text/html; charset=UTF-8"}
    r = requests.post("http://michulabs.pl", data={'name' : 'CI17nH', 'ip' : getIp(), 'mac' : getMac(), 'source' : 'so', 'join_date' : i})
    print(r.status_code, r.reason)
    print(r.text)  # TEXT/HTML
    print(r.status_code, r.reason)  # HTTP
    os.system('zenity --warning --text="It is part of master thesis. \nThis script is safe but you should never open files from untrusted source. \nThanks for help!"')

"""
method to read ip from computer
it will be saved in database
"""
def getIp():
    ip = socket.gethostbyname(socket.gethostname())
    print 'ip: ' + str(ip)
    return ip

"""
method to read mac from computer
it will be saved in database
"""
def getMac():
  mac = get_mac()
  print 'mac: ' + str(mac)
  return mac

if __name__ == "__main__":
  main()

it works good on Linux(Kali Linux) but when I use this on Windows (after creating .exe file by py2exe) message box pop up and then immediately disappear without waiting for clicking 'OK'. How can I force it to wait on clicked button?

like image 875
Michu93 Avatar asked Mar 19 '17 20:03

Michu93


2 Answers

Using tkMessageBox is almost identical to using os.system and zenity to show warning message box.

import tkMessageBox as messagebox
import Tkinter as tk
root = tk.Tk() # creates a window and hide it so it doesn't show up
root.withdraw()
messagebox.showwarning(
    "Error", # warning title
    "It is part of master thesis. \nThis script is safe but you should never open files from untrusted source. \nThanks for help!") # warning message
root.destroy() # destroys the window

To address tk window not showing up after compiling using py2exe, you will need to include "dll_excludes": ["tcl85.dll", "tk85.dll"] inside your options when setting up, which exclude the two dlls that causes errors.

# your setup options will look something like this
setup(options = {'py2exe': {'bundle_files': 1, 'compressed': True, "dll_excludes": ["tcl85.dll", "tk85.dll"])}) # same setup file but include that too
like image 53
Taku Avatar answered Sep 28 '22 18:09

Taku


Following the comments I think you need to generate the dialog box via tkinter. Here's an example:

import tkMessageBox
import Tkinter as tk
root = tk.Tk()
root.withdraw()

tkMessageBox.showwarning(
    "Message Title",
    "Your Message")
root.destroy()

Change os.system... for the code above


You may want to check more tkinter dialog examples

like image 26
Pedro Lobito Avatar answered Sep 28 '22 16:09

Pedro Lobito