コード例 #1
0
        class A_DWI:
            def __init__(self, container, frame, label='', text='', row=0, column=0):
                self.container = container
                self.is_b0 = BooleanVar(container.parent)
                self.is_dw = BooleanVar(container.parent)
                self.column = column
                self.direction = StringVar(container.parent)

                self.label_from = Label(frame, text='from')
                self.text_from = Entry(frame)
                self.text_from.insert(0, text)
                self.button_file_from = Button(frame, text='...', command=lambda:filenameDialog_text(self.text_from))
                self.button_rm = Button(frame, text='remove', command=self.click_remove)
                self.radio_ap = Radiobutton(frame, text='AP', variable=self.direction, value='AP', command=self.set_direction)
                self.radio_pa = Radiobutton(frame, text='PA', variable=self.direction, value='PA', command=self.set_direction)

                self.label_to = Label(frame, text='to')
                self.text_to = Entry(frame)
                #self.text_to.insert(0, text)
                self.button_file_to = Button(frame, text='Gen', command=self.set_filename_to)
                self.check_b0 = Checkbutton(frame, text='B0',   variable=self.is_b0)
                self.check_dw = Checkbutton(frame, text='DWI',  variable=self.is_dw)

                self.button_up = Button(frame, text='up', width=3, command=self.click_up)
                self.button_dn = Button(frame, text='down', width=3, command=self.click_dn)

                self.row = -1
                self.change_row(row)
                if text != '':
                    self.set_appa()
                    self.set_filename_to()

            def prefix(self):
                return self.container.parent.prefix()

            def set_direction(self):
                pass

            def get_dwi_filenames(self):
                '''
                :return: [('from', 'to'), ('from', 'to')]
                '''
                filename_from = self.text_from.get()
                filename_to = self.text_to.get()
                if self.is_dw.get():
                    rtn = [ [filename_from, filename_to] ]
                    filename_b_from = filename_wo_ext(filename_from)
                    filename_b_to = filename_wo_ext(filename_to)
                    rtn.append( [filename_b_from+'.bval', filename_b_to+'.bval'] )
                    rtn.append( [filename_b_from+'.bvec', filename_b_to+'.bvec'] )
                    return rtn
                return []

            def get_b0_filename(self):
                '''
                :return: [('from', 'to')]
                '''
                filename_from = self.text_from.get()
                filename_to = self.text_to.get()
                ext = extname(filename_to)
                if self.is_b0.get():
                    if self.is_dw.get():
                        filename_to = '%s_B0%s' % (filename_wo_ext(filename_to), ext)
                    return [ [filename_from, filename_to] ]
                return []

            def set_appa(self):
                filename_from = self.text_from.get()
                basename_from = os.path.basename(filename_from)
                basename_b_from = filename_wo_ext(basename_from)
                if 'pa' in basename_b_from.lower():
                    self.direction.set('PA')
                elif 'ap' in basename_b_from.lower():
                    self.direction.set('AP')
                else:
                    pass

            def set_filename_to(self, middle=None):
                filename_from = self.text_from.get()
                basename_from = os.path.basename(filename_from)
                number = os.path.dirname(filename_from).split('/')[-1].split('_')[0]
                if number == '':
                    number = str(self.row)
                else:
                    try:
                        int(number)
                    except:
                        number = str(self.row)


                ext = extname(basename_from)
                intermediate = self.direction.get()
                if intermediate == '':
                    intermediate = 'DWI'

                if self.is_b0.get() and not self.is_dw.get():
                    intermediate += '_B0'

                self.text_to.delete(0, len(self.text_to.get()))
                self.text_to.insert(0, '%s%s_%s%s' % (self.prefix(), number, intermediate, ext))

            def change_row(self, row):
                if self.row == row:
                    return
                self.row = row
                i = 2*row
                j = self.column
                j += 0; self.button_up.grid(row=i, column=j)
                j += 1; self.label_from.grid(row=i, column=j)
                j += 1; self.text_from.grid(row=i, column=j, sticky=EW)
                j += 1; self.button_file_from.grid(row=i, column=j)
                j += 1; self.button_rm.grid(row=i, column=j)
                j += 1; self.radio_ap.grid(row=i, column=j)
                j += 1; self.radio_pa.grid(row=i, column=j)
                i += 1
                j = 0
                j += 0; self.button_dn.grid(row=i, column=j)
                j += 1; self.label_to.grid(row=i, column=j)
                j += 1; self.text_to.grid(row=i, column=j, sticky=EW)
                j += 1; self.button_file_to.grid(row=i, column=j)
                j += 1
                j += 1; self.check_b0.grid(row=i, column=j)
                j += 1; self.check_dw.grid(row=i, column=j)

            def click_remove(self):
                self.container.remove(self.row)

                self.button_up.destroy()
                self.label_from.destroy()
                self.text_from.destroy()
                self.button_file_from.destroy()
                self.button_rm.destroy()
                self.radio_ap.destroy()
                self.radio_pa.destroy()
                self.button_dn.destroy()
                self.label_to.destroy()
                self.text_to.destroy()
                self.button_file_to.destroy()
                self.check_b0.destroy()
                self.check_dw.destroy()

            def click_up(self):
                self.container.up(self.row)
            def click_dn(self):
                self.container.dn(self.row)
コード例 #2
0
class Nono_Main(Frame):
    '''
    It is GUI for player to choose nonogram,
    or to import from text file or picture
    '''
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):
        '''
        Loades nonograms from Nonogram base.txt file,
        fills list of nonograms and creates all widgets
        within GUI
        '''
        self.parent.title("Nonograms")
        base_nonograms = import_from_file("Nonogram base.txt")
        self.all_nonograms = []
        menubar = tk.Menu(self.parent)
        self.parent.config(menu=menubar)
        self.fl = ""
        fileMenu = tk.Menu(menubar)
        fileMenu.add_command(label="Export", command=self.export)
        fileMenu.add_command(label="Open", command=self.onOpen)
        fileMenu.add_command(label="Exit", command=self.onExit)
        menubar.add_cascade(label="File", menu=fileMenu)

        self.pack(fill=tk.BOTH, expand=1)
        nonos = []
        for n in range(len(base_nonograms['unique'])):
            nonos.append('Nonogram ' + str(len(self.all_nonograms) + n))
        self.all_nonograms += base_nonograms['unique']
        for n in range(len(base_nonograms['nonunique'])):
            nonos.append('NUS Nonogram ' + str(len(self.all_nonograms) + n))
        self.all_nonograms += base_nonograms['nonunique']
        for n in range(len(base_nonograms['hard'])):
            nonos.append('HARD Nonogram ' + str(len(self.all_nonograms) + n))
        self.all_nonograms += base_nonograms['hard']
        self.lb = tk.Listbox(self)
        for i in nonos:
            self.lb.insert(tk.END, i)

        self.lb.bind("<<ListboxSelect>>", self.onSelect)

        self.lb.place(x=20, y=40)

        info1 = Label(self, text='Select nonogram:')
        info1.place(x=30, y=10)

        info2 = Label(self, text='Or choose a file:')
        info2.place(x=180, y=10)

        self.browseButton = tk.Button(self,
                                      text='Browse...',
                                      command=self.onBrowse)
        self.browseButton.place(x=200, y=30)

        self.info3 = Label(self, text="")
        self.info3.place(x=150, y=60)

        self.info4 = Label(self, text="Rows:")
        self.ySize = tk.Entry(self, width=5)

    def onSelect(self, val):
        '''
        When player selects nonogram from list,
        new window appears with this particular
        nonogram.
        '''
        sender = val.widget
        num = sender.curselection()[0]
        current_nonogram = self.all_nonograms[num]
        master = tk.Tk()
        if 'HARD' not in sender.get(sender.curselection())\
           and 'Picture' not in sender.get(sender.curselection()):
            current_nonogram.solve()
            current_nonogram.full_solve()
            app = ShowNono(master, current_nonogram.Rows,
                           current_nonogram.Columns,
                           current_nonogram.nonogram_Matrix,
                           current_nonogram.pair)
            app.mainloop()
        else:
            app = ShowNonoHard(master, current_nonogram.Rows,
                               current_nonogram.Columns)
            app.mainloop()

    def onBrowse(self):
        '''
        Opens filedialog window, so player can choose
        text file or picture to add nonograms. In the
        second case player is asked to give dimensions
        of picture he wants to solve.
        WARNING!
        Image size ratio cannot be changed!
        So if original picture has resolution 900x900
        and players gives X = 10, Y = 100 picture will
        be converted to X = 100 and Y = 100, to retain
        size ratio and to match Y.
        '''
        if self.ySize:
            self.ySize.destroy()
        if self.info4:
            self.info4.destroy()
        ftypes = [('Text files', '*.txt'), ('Pictures', '*.jpg; *.png; *.bmp')]
        dlg = filedialog.Open(self, filetypes=ftypes)
        self.fl = dlg.show()
        sss = self.fl.split("/")
        self.info3.configure(text=sss[-1])
        if self.fl[-3:] == "txt":
            self.convert = tk.Button(self,
                                     text='Convert',
                                     command=self.converty)
            self.convert.place(x=200, y=160)

        elif self.fl[-3:] in ['jpg', 'png', 'bmp']:
            self.ySize = tk.Entry(self, width=5)
            self.ySize.place(x=210, y=100)

            self.info4 = Label(self, text="Rows:")
            self.info4.place(x=150, y=100)

            self.convert = tk.Button(self,
                                     text='Convert',
                                     command=self.converty)
            self.convert.place(x=200, y=160)

    def converty(self):
        '''
        Imports and adds to list nonograms from file,
        or converts picture to nonogram and adds it
        to the list.
        '''
        if self.fl[-3:] == "txt":
            base_nonograms = import_from_file(self.fl)
            name = self.fl.split("/")[-1].split(".")[0]
            nonos = []
            for n in range(len(base_nonograms['unique'])):
                nonos.append('My ' + name + ' ' +
                             str(len(self.all_nonograms) + n))
            self.all_nonograms += base_nonograms['unique']
            for n in range(len(base_nonograms['nonunique'])):
                nonos.append('My NUS ' + name + ' ' +
                             str(len(self.all_nonograms) + n))
            self.all_nonograms += base_nonograms['nonunique']
            for n in range(len(base_nonograms['hard'])):
                nonos.append('HARD ' + name + ' ' +
                             str(len(self.all_nonograms) + n))
            self.all_nonograms += base_nonograms['hard']
            for i in nonos:
                self.lb.insert(tk.END, i)
        elif self.fl[-3:] in ['jpg', 'png', 'bmp']:
            name = self.fl.split("/")[-1].split(".")[0]
            rows, cols = import_picture(self.fl, int(self.ySize.get()),
                                        int(self.ySize.get()))
            ngram = nonogram(rows, cols)
            self.lb.insert(
                tk.END, "Picture " + name + ' ' + str(len(self.all_nonograms)))
            self.all_nonograms.append(ngram)
            self.ySize.destroy()
            self.info4.destroy()

        self.convert.destroy()
        self.info3.configure(text="")

    def onOpen(self):
        self.onBrowse()

    def onExit(self):
        self.parent.destroy()

    def export(self):
        '''
        Saves all nonograms from the list to "Nonogram base.txt" so
        they will be loaded on next opening.
        '''
        text = [
            str(nonogram.Rows) + '\n' + str(nonogram.Columns)
            for nonogram in self.all_nonograms
        ]
        new_text = '\n\n'.join(text)
        f = open('Nonogram base.txt', 'w')
        f.write(new_text)
        f.close