Хотя я думаю, что ответ Брайана проще и полностью решает проблему, вы можете решить проблему «clickability» с привязками (у меня не было второй проблемы, поэтому мой ответ не обратился к ней).
Идея состоит в том, чтобы связать щелчки мыши по кадрам, чтобы вызвать щелчок по кнопке и восстановить обычное поведение кнопки. В моем примере ниже я привязал оба <ButtonPress-1>
и <ButtonRelease-1>
, чтобы увидеть эффекты эффекта кнопки. Я также связал <Enter>
и <Leave>
, чтобы реализовать изменение цвета кнопки, когда мышь над ним.
from Tkinter import *
master = Tk()
buttons = {}
def press(clicked):
print clicked
def frame_enter(redframe, blueframe):
redframe.configure(background='coral1')
blueframe.configure(background='royalblue1')
def frame_leave(redframe, blueframe):
redframe.configure(background='red')
blueframe.configure(background='blue')
def on_press(event, button):
button.event_generate('<ButtonPress-1>', x=event.x, y=event.y)
def on_release(event, button):
button.event_generate('<ButtonRelease-1>', x=event.x, y=event.y)
for i in range(1,7):
button_name = 'button '+str(i)
buttons[i] = Button(master, text=button_name, command=lambda method=button_name:press(method))
buttons[i].grid(row=0, column=i-1, padx=15)
buttons[i].update()
tot_x = buttons[i].winfo_width()
tot_y = buttons[i].winfo_height()
redframe = Frame(buttons[i], width=tot_x/6, background='red')
blueframe = Frame(buttons[i], width=tot_x/6*5, background='blue')
redframe.place(x=0, y=0, relheight=1)
blueframe.place(relx=1./6, y=0, relheight=1)
redframe.bind('<ButtonPress-1>', lambda e, b=buttons[i]: on_press(e, b))
blueframe.bind('<ButtonPress-1>', lambda e, b=buttons[i]: on_press(e, b))
redframe.bind('<ButtonRelease-1>', lambda e, b=buttons[i]: on_release(e, b))
blueframe.bind('<ButtonRelease-1>', lambda e, b=buttons[i]: on_release(e, b))
redframe.bind('<Enter>', lambda e, rf=redframe, bf=blueframe: frame_enter(rf, bf))
blueframe.bind('<Enter>', lambda e, rf=redframe, bf=blueframe: frame_enter(rf, bf))
redframe.bind('<Leave>', lambda e, rf=redframe, bf=blueframe: frame_leave(rf, bf))
blueframe.bind('<Leave>', lambda e, rf=redframe, bf=blueframe: frame_leave(rf, bf))
master.mainloop()
Изменить: держать кнопки не нужно, их можно заменить кадрами. Таким образом, не нужно использовать place
, цветные кадры можно просто упаковать внутри:
from Tkinter import *
master = Tk()
buttons = {}
def press(clicked):
print clicked
def frame_enter(redframe, blueframe):
redframe.configure(background='coral1')
blueframe.configure(background='royalblue1')
def frame_leave(redframe, blueframe):
redframe.configure(background='red')
blueframe.configure(background='blue')
def on_press(event, widget):
widget.configure(relief='sunken') # mimic button's relief effect on click
def on_release(event, widget, text):
widget.configure(relief='raised') # mimic button's relief effect on click
press(text)
for i in range(1,7):
button_name = 'button '+ str(i)
buttons[i] = Frame(master, relief='raised', width=78, height=24, bd=2)
buttons[i].grid(row=0, column=i-1, padx=15)
buttons[i].update_idletasks()
tot_x = buttons[i].winfo_width()
tot_y = buttons[i].winfo_height()
redframe = Frame(buttons[i], width=tot_x/6, height=tot_y, background='red')
blueframe = Frame(buttons[i], width=tot_x/6*5, height=tot_y, background='blue')
redframe.pack(side='left')
blueframe.pack(side='left')
redframe.bind('<ButtonPress-1>', lambda e, b=buttons[i]: on_press(e, b))
blueframe.bind('<ButtonPress-1>', lambda e, b=buttons[i]: on_press(e, b))
redframe.bind('<ButtonRelease-1>', lambda e, b=buttons[i], t=button_name: on_release(e, b, t))
blueframe.bind('<ButtonRelease-1>', lambda e, b=buttons[i], t=button_name: on_release(e, b, t))
redframe.bind('<Enter>', lambda e, rf=redframe, bf=blueframe: frame_enter(rf, bf))
blueframe.bind('<Enter>', lambda e, rf=redframe, bf=blueframe: frame_enter(rf, bf))
redframe.bind('<Leave>', lambda e, rf=redframe, bf=blueframe: frame_leave(rf, bf))
blueframe.bind('<Leave>', lambda e, rf=redframe, bf=blueframe: frame_leave(rf, bf))
Это зависит от синтаксиса ассемблера. В основном у нас есть два варианта: Intel и AT & T синтаксис.
Существует несколько разновидностей синтаксиса Intel, основными из которых являются NASM (mov dword [symbol_name], 1
) и MASM (включая режим GAS .intel_syntax noprefix
, который могут использовать многие инструменты GNU и Unix.) См. https: // stackoverflow. com / tags / intel-syntax / info для получения подробной информации о различиях и их различения.
Пример синтаксиса Intel (из разборки objdump, так что это GNU .intel_syntax
, с добавлением пары примеров):
push rbp # comment character can be # (GAS) or ; MASM/NASM
mov rbp,rsp
mov DWORD PTR [rbp-0x4],edi
mov DWORD PTR [rbp-0x8],esi
mov edx,DWORD PTR [rbp-0x4]
mov eax,DWORD PTR [rbp-0x8]
add eax,edx
pop rbp
ret
add dword ptr [rdi], 1 # size specifier mandatory if neither operand is a reg
imul ecx, [rdi + rax*4 + 20], 12345
Существует только один вариант синтаксиса AT & amp; T ( https : //stackoverflow.com/tags/att/info ):
push %rbp # comment character is always #
mov %rsp,%rbp
mov %edi,-0x4(%rbp)
mov %esi,-0x8(%rbp)
mov -0x4(%rbp),%edx
mov -0x8(%rbp),%eax
add %edx,%eax
pop %rbp
retq
addl $1, (%rdi) # size suffix b/w/l/q used to indicate operand-size if neither operand is a register
# with more than 2 operands, reverse the whole list
imul $12345, 20(%rdi, %rax, 4), %ecx
Синтаксис AT & T является родным для систем Unix. Обычно декомпиляторы имеют флаги для управления типом синтаксиса вывода. Например, objdump
имеет флаг -Mintel
, у GDB есть опция set disassembly-flavor intel
.
Кроме того, взгляните на этот полезный сайт, на котором вы можете быстро увидеть вывод ассемблера без шума. Проводник компилятора
Обратите внимание, что синтаксис AT & amp; T имеет ошибку проектирования для x87 некоммутативные инструкции FP, такие как fsub
и fsubr
с операндами регистра: см. руководство: https://sourceware.org/binutils/docs/as/i386_002dBugs.html