2015-05-12 89 views
3

我试图将窗口图标添加到内置于TKinter中的主窗口的子窗口。为了便于携带(又名没有丢失的文件),我已经将base64编码gif中的主窗口图标设置为变量。我一直无法复制这个子窗口。TKinter:如何设置子窗口(Toplevel)的窗口图标

from Tkinter import * 

ICON = """ 
R0lGODlhMgAyAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wArAAArMwArZgArmQArzAAr/wBVAABVMwBV 
ZgBVmQBVzABV/wCAAACAMwCAZgCAmQCAzACA/wCqAACqMwCqZgCqmQCqzACq/wDVAADVMwDVZgDV 
mQDVzADV/wD/AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMrADMrMzMrZjMrmTMr 
zDMr/zNVADNVMzNVZjNVmTNVzDNV/zOAADOAMzOAZjOAmTOAzDOA/zOqADOqMzOqZjOqmTOqzDOq 
/zPVADPVMzPVZjPVmTPVzDPV/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2Yr 
AGYrM2YrZmYrmWYrzGYr/2ZVAGZVM2ZVZmZVmWZVzGZV/2aAAGaAM2aAZmaAmWaAzGaA/2aqAGaq 
M2aqZmaqmWaqzGaq/2bVAGbVM2bVZmbVmWbVzGbV/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kA 
ZpkAmZkAzJkA/5krAJkrM5krZpkrmZkrzJkr/5lVAJlVM5lVZplVmZlVzJlV/5mAAJmAM5mAZpmA 
mZmAzJmA/5mqAJmqM5mqZpmqmZmqzJmq/5nVAJnVM5nVZpnVmZnVzJnV/5n/AJn/M5n/Zpn/mZn/ 
zJn//8wAAMwAM8wAZswAmcwAzMwA/8wrAMwrM8wrZswrmcwrzMwr/8xVAMxVM8xVZsxVmcxVzMxV 
/8yAAMyAM8yAZsyAmcyAzMyA/8yqAMyqM8yqZsyqmcyqzMyq/8zVAMzVM8zVZszVmczVzMzV/8z/ 
AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8rAP8rM/8rZv8rmf8rzP8r//9VAP9V 
M/9VZv9Vmf9VzP9V//+AAP+AM/+AZv+Amf+AzP+A//+qAP+qM/+qZv+qmf+qzP+q///VAP/VM//V 
Zv/Vmf/VzP/V////AP//M///Zv//mf//zP///wAAAAAAAAAAAAAAACH5BAEAAPwALAAAAAAyADIA 
AAj/APcJHEiwoMGDCBMqXCjQnsOHECEynIgQIjx7FzNi3HjRIcWPHC0+7LixpL2PCk2GXNmx5UaU 
BkW6NDlzpkeY+xxq1MmTZU+XF2GWrNnz50ijJykO5Um0KdKgDI+qJEm1KM2fC3cCZYrU59KbFb1O 
NVr1a8aEY30SlWqTZNKYK6+a5eqU48GiO0sC2Mu3I9++XUkWXFq15d+9Og8DeMqVoE28DhX7PdzW 
KkGyXDEqTnyYcciBmOVKjkyZLeSGleVGtHp0reB9qZ1qLJyWaMO5X+Xm3ToXHmrPdWkHLnob91rC 
rYFjFKhVeVfIuV+b3shXeXN71Zv+zv3X9fS/05MyoIbX2fvQ8mSZQyedXTn63LedbjaOvTPj7Y/r 
g8e9+XrH+JhdNN9XA96nXnQP9dfTfP6BlRN9Ag6o2GLIDXWZeQlOOOFwPA0GIXsaIvahQebNFOJ0 
j91VImsyKYdWWcfNpptpKXmFYWxSZYXijhXWNNGM9NXWoVJBxjgXTCsWOSSS0CXpEk6X2eicb1DC 
hduVVSIEY5MOZhnWli95KaaXAQEAOw== 
""" 

class ChildWindow(Toplevel): 
    def __init__(self, callingFrame): 
     self.parent = callingFrame 
     Toplevel.__init__(self) 
     self.title("Child") 
     self.initUI() 

    def initUI(self): 

     #this doesn't work in this class, unlike the first class where it does work. 
     global ICON 
     self.icon = PhotoImage(data=ICON) 
     self.call('wm', 'iconphoto', self.parent._w, self.icon) 

     btn = Button(self, text="Close", command=self.destroy) 
     btn.pack() 


class ParentWindow(object): 

    def __init__(self, parent): 
     self.parent = parent 
     self.parent.title("Parent") 
     self.frame = Frame(parent) 
     self.initUI() 

    def initUI(self): 
     global ICON 
     self.icon = PhotoImage(data=ICON) 
     self.parent.call('wm', 'iconphoto', self.parent._w, self.icon) 

     btn = Button(self.parent, text="Child", command=self.opennew) 
     btn.pack() 

    def opennew(self): 
     newwin = ChildWindow(self) 

def main(): 
    root = Tk() 
    win = ParentWindow(root) 
    root.geometry() 
    root.mainloop() 


if __name__ == '__main__': 
    main() 

回答

2

替换:

self.call('wm', 'iconphoto', self.parent._w, self.icon) 

有:

self.tk.call('wm', 'iconphoto', self._w, self.icon) 
+0

你,先生,岩石。 – mrdrako